当前位置: 首页 > news >正文

国庆中秋特辑(七)Java软件工程师常见20道编程面试题

在这里插入图片描述

以下是中高级Java软件工程师常见编程面试题,共有20道。

  1. 如何判断一个数组是否为有序数组?
    答案:可以通过一次遍历,比较相邻元素的大小。如果发现相邻元素的大小顺序不对,则数组不是有序数组。
public boolean isSortedArray(int[] nums) {  for (int i = 0; i < nums.length - 1; i++) {  if (nums[i] > nums[i + 1]) {  return false;  }  }  return true;  
}
  1. 如何删除一个有序数组中的重复元素?
    答案:可以通过一次遍历,将相邻的重复元素删除。
public int[] removeDuplicates(int[] nums) {  if (nums == null || nums.length == 0) {  return null;  }  int i = 0;  for (int j = 0; j < nums.length; j++) {  if (i == 0 || nums[j]!= nums[i]) {  nums[i++] = nums[j];  }  }  int[] result = new int[i];  System.arraycopy(nums, 0, result, 0, i);  return result;  
}
  1. 如何合并两个有序数组?
    答案:可以通过一次遍历,将两个有序数组合并成一个新的有序数组。
public int[] mergeTwoSortedArrays(int[] nums1, int[] nums2) {  int[] result = new int[nums1.length + nums2.length];  int i = 0, j = 0, k = 0;  while (i < nums1.length && j < nums2.length) {  if (nums1[i] < nums2[j]) {  result[k++] = nums1[i++];  } else {  result[k++] = nums2[j++];  }  }  while (i < nums1.length) {  result[k++] = nums1[i++];  }  while (j < nums2.length) {  result[k++] = nums2[j++];  }  return result;  
}
  1. 如何反转一个数组?
    答案:可以通过一次遍历,将数组的每个元素翻转。
public void reverseArray(int[] nums) {  for (int i = 0; i < nums.length; i++) {  int temp = nums[i];  nums[i] = nums[nums.length - 1 - i];  nums[nums.length - 1 - i] = temp;  }  
}
  1. 如何计算一个数组的平均值?
    答案:将数组的所有元素相加,然后除以数组的长度。
public double averageArray(int[] nums) {  long sum = 0;  for (int num : nums) {  sum += num;  }  return (double) sum / nums.length;  
}
  1. 如何计算一个数组的中位数?
    答案:将数组排序后,找到中间的元素。如果数组长度为偶数,则中间的两个元素的平均值是中位数。
public double medianArray(int[] nums) {  Arrays.sort(nums);  int length = nums.length;  if (length % 2 == 0) {  return (double) (nums[length / 2 - 1] + nums[length / 2]) / 2.0;  } else {  return (double) nums[length / 2];  }  
}
  1. 如何计算一个数组的众数?
    答案:可以通过一次遍历,统计每个元素出现的次数。出现次数最多的元素是众数。
public int mostCommon(int[] nums) {  int[] count = new int[101];  for (int num : nums) {  count[num]++;  }  int max = 0;  int resfor (int i = 0; i < 101; i++) {    if (count[i] > max) {    max = count[i];    res = i;    }    }    return res;    
}
  1. 如何计算一个数组的方差?
    答案:将数组的所有元素相减后求平方,然后求和,最后除以数组的长度。
public double varianceArray(int[] nums) {    long sum = 0;    for (int num : nums) {    sum += num;    }    double mean = (double) sum / nums.length;    double sumSqr = 0;    for (int num : nums) {    double d = num - mean;    sumSqr += d * d;    }    return sumSqr / nums.length;    
}
  1. 如何计算一个数组的标准差?
    答案:计算方差后,对方差开平方根。
public double standardDeviationArray(int[] nums) {    double variance = varianceArray(nums);    return Math.sqrt(variance);    
}
  1. 如何判断一个字符串是否为回文字符串?
    答案:可以通过两次遍历,比较字符串的前半部分和后半部分是否相同。
public boolean isPalindrome(String s) {    int i = 0;    int j = s.length() - 1;    while (i < j) {    if (s.charAt(i)!= s.charAt(j)) {    return false;    }    i++;    j--;    }    return true;    
}
  1. 如何删除一个字符串中的所有重复字符?
    答案:可以通过一次遍历,将字符串中的每个字符添加到一个新的字符数组中,如果字符数组中没有该字符,则将该字符添加到字符数组中。最后将字符数组转换为字符串。
public String removeDuplicates(String s) {    if (s == null || s.length() == 0) {    return null;    }    char[] chars = new char[s.length()];    for (int i = 0; i < s.length(); i++) {    if (chars[i]!= s.charAt(i)) {    chars[chars.length - 1] = s.charAt(i);    }    }    return new String(chars);    
}
  1. 如何合并两个字符串?
    答案:可以通过一次遍历,将两个字符串中的字符合并到一个新的字符串中。
public String mergeStrings(String s1, String s2) {    if (s1 == null) {    return s2;    }    if (s2 == null) {    return s1;    }    StringBuilder sb = new StringBuilder();    for (int i = 0; i < Math.max(s1.length(), s2.length()); i++) {    char c1 = (i < s1.length())? s1.charAt(i) : '\0';    char c2 = (i < s2.length())? s2.charAt(i) : '\0';    sb.append(c1);    sb.append(c2);    }    return sb.toString();    
}
  1. 如何计算两个字符串的编辑距离?
    答案:可以通过动态规划的方法,计算将一个字符串转换为另一个字符串所需的最少操作次数。
public int editDistance(String s1, String s2) {  int m = s1.length();  int n = s2.length();  int[][] dp = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) {  for (int j = 0; j <= n; j++) {  if (i == 0) {  dp[i][j] = j;  } else if (j == 0) {  dp[i][j] = i;  } else if (s1.charAt(i - 1) == s2.charAt(j - 1)) {  dp[i][j] = dp[i - 1][j - 1];  } else {  dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1;  }  }  }  return dp[m][n];  
}
  1. 如何实现一个单例模式?
    答案:可以使用懒汉式和饿汉式实现单例模式。
    懒汉式:
public class Singleton {  private static Singleton instance;private Singleton() {  }public static Singleton getInstance() {  if (instance == null) {  instance = new Singleton();  }  return instance;  }  
}

饿汉式:

public class Singleton {  private static final Singleton instance = new Singleton();private Singleton() {  }public static Singleton getInstance() {  return instance;  }  
}
  1. 如何实现一个工厂模式?
    答案:创建一个工厂类,根据传入的参数创建相应的对象。
public class Factory {  public static void main(String[] args) {  Product productA = factory.createProductA();  Product productB = factory.createProductB();productA.display();  productB.display();  }public static Product createProductA() {  return new ProductA();  }public static Product createProductB() {  return new ProductB();  }  
}
abstract class Product {  public abstract void display();  
}
class ProductA extends Product {  public void display() {  System.out.println("Product A");  }  
}
class ProductB extends Product {  public void display() {  System.out.println("Product B");  }  
}
  1. 如何实现一个观察者模式?
    答案:创建一个观察者接口,一个主题接口,以及具体的观察者和主题类。当主题状态发生变化时,通知所有观察者。
public class ObserverPattern {  public static void main(String[] args) {  Subject subject = new Subject();  Observer observer1 = new ConcreteObserver(subject);  Observer observer2 = new ConcreteObserver(subject);subject.addObserver(observer1);  subject.addObserver(observer2);subject.notifyObservers();  }public static interface Subject {  void addObserver(Observer observer);  void removeObserver(Observer observer);  void notifyObservers();  }public static interface Observer {  void update(String message);  }public static class ConcreteObserver implements Observer {  private Subject subject;public ConcreteObserver(Subject subject) {  this.subject = subject;  }@Override  public void update(String message) {  System.out.println("Received: " + message);  }  }public static class ConcreteSubject implements Subject {  private List<Observer> observers;public ConcreteSubject() {  observers = new ArrayList<>();  }@Override  public void addObserver(Observer observer) {  observers.add(observer);  }@Override  public void removeObserver(Observer observer) {  observers.remove(observer);  }@Override  public void notifyObservers() {  for (Observer observer : observers) {  observer.update("Hello, World!");  }  }  }  
}
  1. 如何实现一个策略模式?
    答案:创建一个策略接口,以及具体的策略类。在运行时,根据不同的情况选择相应的策略来执行。
public class StrategyPattern {  public static void main(String[] args) {  Strategy strategy = new DefaultStrategy();  strategy.execute();strategy = new CustomStrategy();  strategy.execute();  }public static interface Strategy {  void execute();  }public static class DefaultStrategy implements Strategy {  @Override  public void execute() {  System.out.println("Default strategy");  }  }public static class CustomStrategy implements Strategy {  @Override  public void execute() {  System.out.println("Custom strategy");  }  }  
}
  1. 如何实现一个适配器模式?

实现适配器模式需要以下几个步骤:

  1. 确定目标接口:首先需要明确要适配的目标接口,即客户端期望使用的接口。这个接口可以是一个现有的接口,也可以是一个抽象的接口。
  2. 创建适配器类:创建一个适配器类,该类将实现目标接口,并在其内部包含一个被适配的类的实例。适配器类需要实现目标接口的所有方法,并在这些方法中调用被适配的类的相应方法。
  3. 实现目标接口:在适配器类中实现目标接口的所有方法,这些方法将被客户端使用。在实现这些方法时,需要将客户端传入的参数传递给被适配的类的相应方法,并将被适配的类的方法返回的结果返回给客户端。
    下面是一个简单的适配器模式实现示例:
// 目标接口  
public interface Target {  void request();  
}
// 被适配的类  
public class Adaptee {  public void specificRequest() {  System.out.println("被适配的类的方法被调用");  }  
}
// 适配器类  
public class Adapter implements Target {  private Adaptee adaptee;public Adapter(Adaptee adaptee) {  this.adaptee = adaptee;  }@Override  public void request() {  adaptee.specificRequest();  }  
}
// 客户端代码  
public class Client {  public static void main(String[] args) {  Adaptee adaptee = new Adaptee();  Target target = new Adapter(adaptee);  target.request();  }  
}

在这个示例中,Target 是目标接口,Adaptee 是被适配的类,Adapter 是适配器类。适配器类 Adapter 实现了目标接口 Target,并在其 request() 方法中调用了被适配的类 AdapteespecificRequest() 方法。客户端代码通过目标接口 Target 使用适配器类 Adapter,实现了对被适配的类 Adaptee 的调用。

  1. 题目:汉诺塔问题
    问题描述:请用 Java 实现一个解决方案,解决汉诺塔问题。汉诺塔是一个经典的递归问题,要求将一个杆子上的 N 个圆盘按照一定的规则从一边移动到另一边。
    答案:以下是一个 Java 实现汉诺塔问题的示例代码:
public class HanoiTower {  public static void main(String[] args) {  int n = 3; // 设置盘子的数量  hanoi(n, 'A', 'B', 'C');  }/**  * 汉诺塔递归方法  * @param n 盘子数量  * @param from 源柱子  * @param auxiliary 辅助柱子  * @param to 目标柱子  */  public static void hanoi(int n, char from, char auxiliary, char to) {  if (n == 1) { // 当只有一个盘子时,直接从源柱子移动到目标柱子  System.out.println("Move disk 1 from " + from + " to " + to);  } else {  // 将 n-1 个盘子从源柱子借助目标柱子移动到辅助柱子  hanoi(n - 1, from, to, auxiliary);  // 将第 n 个盘子从源柱子移动到目标柱子  System.out.println("Move disk " + n + " from " + from + " to " + to);  // 将 n-1 个盘子从辅助柱子借助源柱子移动到目标柱子  hanoi(n - 1, auxiliary, from, to);  }  }  
}
  1. 题目:购物车类
    问题描述:请设计一个购物车类,包含添加商品、删除商品、计算总价等功能。
    答案:以下是一个简单的购物车类实现:
public class ShoppingCart {  private ArrayList<Item> items;public ShoppingCart() {  items = new ArrayList<>();  }/**  * 向购物车添加商品  * @param item 商品对象  */  public void addItem(Item item) {  for (int i = 0; i < items.size(); i++) {  if (items.get(i) == item) {  items.set(i, item);  return;  }  }  items.add(item);  }/**  * 从购物车中删除商品  * @param item 商品对象  * @return 是否成功删除  */  public boolean removeItem(Item item) {  for (int i = 0; i < items.size(); i++) {  if (items.get(i) == item) {  items.remove(i);  return true;  }  }  return false;  }/**  * 计算购物车中商品的总价  * @return 总价  */  public double calculateTotal() {  double total = 0;  for (Item item : items) {  total += item.getPrice();  }  return total;  }  
}

购物车类使用一个 ArrayList 来存储商品对象。添加商品、删除商品和计算总价的方法分别遍历 ArrayList 来完成相应操作。

相关文章:

国庆中秋特辑(七)Java软件工程师常见20道编程面试题

以下是中高级Java软件工程师常见编程面试题&#xff0c;共有20道。 如何判断一个数组是否为有序数组&#xff1f; 答案&#xff1a;可以通过一次遍历&#xff0c;比较相邻元素的大小。如果发现相邻元素的大小顺序不对&#xff0c;则数组不是有序数组。 public boolean isSort…...

长剖与贪心+树上反悔贪心:1004T4

长剖的本质是一种贪心。&#xff08;启发式合并本质也是类似哈夫曼树的过程&#xff09; 在此题中&#xff0c;首先肯定变直径&#xff0c;然后选端点为根。然后选叶子。而每个叶子为了不重复计算&#xff0c;可以只计算其长剖后所在链的贡献。&#xff08;本题精髓&#xff0…...

二叉树经典例题

前言&#xff1a; 本文主要讲解了关于二叉树的简单经典的例题。 因为二叉树的特性&#xff0c;所以关于二叉树的大部分题目&#xff0c;需要利用分治的思想去递归解决问题。 分治思想&#xff1a; 把大问题化简成小问题&#xff08;根节点、左子树、右子树&#xff09;&…...

什么是指针的指针和指向函数的指针?

理解指针的指针和指向函数的指针对于C语言初学者来说可能会有些挑战&#xff0c;但它们都是非常重要的概念&#xff0c;可以帮助你更好地理解和利用C语言的强大功能。在本文中&#xff0c;我将详细解释这两个概念&#xff0c;包括它们的概念、用途和示例。 指针的指针&#xf…...

多个excel合并

目的&#xff1a;将同一个文件下的多个 “京东差评.xlsx” 合并为一个&#xff1a;“京东汇总.xlsx" 代码如下&#xff1a; # -*- coding: utf-8 -*- """ Created on Wed Oct 4 12:52:32 2023author: 64884 """import pandas as pd impor…...

Integrity Plus for Mac,保障网站链接无忧之选

在如今数字化的时代&#xff0c;网站链接的完整性对于用户体验和搜索引擎排名至关重要。如果您是一位网站管理员或者经常需要检查网站链接的人&#xff0c;那么Integrity Plus for Mac&#xff08;Integrity Plus&#xff09;将成为您最好的伙伴。 Integrity Plus是一款专业的…...

C#,数值计算——Sobol拟随机序列的计算方法与源程序

1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { /// <summary> /// Sobol quasi-random sequence /// </summary> public class Sobol { public Sobol() { } public static void sobseq(int n,…...

以太网协议介绍(ARP、UDP、ICMP、IP)

以太网协议介绍 一、ARP协议 请求&#xff1a; 应答&#xff1a; ARP协议&#xff1a; 0x0001 0x0800 6 4硬件类型&#xff1a;2个字节&#xff0c;arp协议不仅能在以太网上运行还能在其他类型的硬件上运行。以太网用1来表示&#xff1b; 协议类型&#xff1a;两字节。指的是a…...

【C++】STL详解(十)—— 用红黑树封装map和set

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】STL…...

Android学习之路(17) Android Adapter详解

Adapter基础讲解 本节引言 从本节开始我们要讲的UI控件都是跟Adapter(适配器)打交道的&#xff0c;了解并学会使用这个Adapter很重要&#xff0c; Adapter是用来帮助填充数据的中间桥梁&#xff0c;简单点说就是&#xff1a;将各种数据以合适的形式显示到view上,提供 给用户看…...

实验室超声波萃取技术的原理和特点是什么?

梵英超声(fanyingsonic)实验室超声波清洗机 超声波萃取中药材的优越性源于超声波的特殊物理性质。通过压电换能器产生的快速机械振动波&#xff0c;超声波可减少目标萃取物与样品基体之间的作用力&#xff0c;从而实现固液萃取分离。 &#xff08;1&#xff09;加速介质质点运…...

用Python操作Word文档,看这一篇就对了!

本文主要讲解Python中操作word的思路。 一、Hello&#xff0c;world&#xff01; 使用win32com需要安装pypiwin32 pip install pypiwin32 推荐使用python的IDLE&#xff0c;交互方便 1、如何新建文档 from win32com.client import Dispatchapp Dispatch(Word.Application…...

力扣 -- 879. 盈利计划(二维费用的背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化的代码&#xff1a; class Solution { public:int profitableSchemes(int n, int minProfit, vector<int>& group, vector<int>& profit) {//计划数int lengroup.size();//每一维都多开一行空间vector&…...

虚拟机的三种网络连接模式

文章目录 桥接模式NAT模式主机模式 桥接模式 虚拟系统占用主机网段中的一个IP地址&#xff0c;可以正常上网 NAT模式 主机生成一个非本主机的网段的IP的网卡&#xff0c;同时虚拟系统中使用一个该网段的IP地质&#xff0c;网络数据能通过主机的网卡来代理发送出去&#xff0…...

SQL调优

# 插入数据 页合并 # order by优化 视频教程&#xff1a;34. 进阶-SQL优化-order by优化_哔哩哔哩_bilibili 在创建索引的时候&#xff0c;如果没有设置顺序&#xff0c;是会默认升序的&#xff1b;但phone想要倒序&#xff0c;则需要额外的排序 根据需要&#xff0c;创建联合…...

python写一个开机启动的选项

创建一个Python脚本&#xff0c;以便用户可以选择在开机时启动它&#xff0c;可以使用pyautogui库来创建一个简单的交互式界面&#xff0c;其中用户可以选择是否将程序添加到开机启动项中 import pyautogui import osdef add_to_startup():# 提示用户选择是否要在开机时启动程序…...

1500*A. Boredom(DP)

Problem - 455A - Codeforces Boredom - 洛谷 解析&#xff1a; 首先统计每个数的个数&#xff0c;并且统计出最大值mx。 问题转换为&#xff0c;从1-mx 中选择任意个数字&#xff0c;使其都不相邻&#xff0c;求最大的总和。 开始没有思路&#xff0c;以为直接选取偶数位和奇…...

小程序关键词排名:优化你的应用在搜索中的地位

曾经&#xff0c;我们沉浸在应用商店的浩瀚海洋中&#xff0c;寻找着那个能够满足我们需求的小程序。而今&#xff0c;作为开发者&#xff0c;你的小程序究竟能否在这个无边的数字海洋中引起更多涟漪呢&#xff1f;故事的开始&#xff0c;恰巧就在这个问题的探寻中。让我们携手…...

OpenGLES:3D立方体纹理贴图

效果展示 一.概述 前几篇博文讲解了OpenGLES绘制多种3D图形&#xff0c;并赋予丰富的色彩&#xff0c;但是在这些3D图形绘制过程中&#xff0c;有一点还没有涉及&#xff0c;就是纹理贴图。 今天这篇博文我会用如下六张图片对立方体进行纹理贴图&#xff0c;实现六个面都是贴…...

线程的概述

#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能&#xff1a;创建一个子线程 参数&#xff1a; -thread:传出参数&#xff0c;线程创建成功后&#xff0c;子线程的ID被写到…...

竞赛选题 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…...

python绘图系统27:matplotlib中平面坐标、极坐标和三维坐标的所有绘图函数

文章目录 绘图函数列表为DrawType添加这些绘图函数绘图类别跳转坐标系坐标源代码 绘图函数列表 下面整理了几乎所有matplotlib中的绘图函数&#xff0c;及其在不同坐标轴下的表现。 函数类别2Dpolar3D备注imshow图像X❌❌pcolormesh伪彩图[X,Y,]ZX,Y,Z❌plot曲线图x[,y]x[,y]…...

国庆中秋宅家自省: Python在Excel中绘图尝鲜

【一】国庆中秋: 悟 【国庆中秋】双节来临,相信各位有自己度过的方式,而我却以独特的方式度过了一个说出来不怕各位见笑的双节; 双节到来,没有太多惊喜&#xff0c;也没有太多的负面情绪, 只是喜欢独处,静静反省这些年走过的酸甜苦辣&#xff1b;生活中的许多不欢而散,不期而遇…...

计算机中的进制转换

在计算机软件中&#xff0c;经常需要进行进制转换&#xff0c;这包括二进制、八进制、十进制和十六进制之间的转换。以下是一些常见的转换方法&#xff1a; 二进制转十进制&#xff1a;这是最直接的转换&#xff0c;基本上不需要什么特别的算法。你只需要按照二进制的权值进行…...

Oracle统计信息问题排查常用SQL

Oracle统计信息问题排查常用SQL 对表的基本情况分析统计信息收集作业分析最近一次的统计信息收集修改触发统计信息收集的阈值 对表的基本情况分析 是否为临时表&#xff1a; select owner,table_name,temporary from dba_tables where table_namexxx;是否为分区表&#xff1a…...

css圣杯布局和双飞翼布局

圣杯布局 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, in…...

机器学习笔记 - 深入研究spaCy库及其使用技巧

一、简述 spaCy 是一个用于 Python 中高级自然语言处理的开源库。它专为生产用途而设计,这意味着它不仅功能强大,而且快速高效。spaCy 在学术界和工业界广泛用于各种 NLP 任务,例如标记化、词性标注、命名实体识别等。 安装,这里使用阿里的源。 pip install spacy…...

网站强制跳转至国家反诈中心该怎么办?怎么处理?如何解封?

在互联网环境中&#xff0c;网站安全是非常重要的。然而&#xff0c;在实际操作过程中&#xff0c;不少网站可能因内容问题、技术安全漏洞等原因被迫下线甚至跳转至国家反诈骗中心网址。面对这一严峻问题&#xff0c;我们如何有效解决&#xff0c;让网站恢复运行并解除强制跳转…...

2023年10月4日

服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);//此时&#xff0c;服务器已经成功进入监听状态&…...

MacBook 录制电脑内部声音

MacBook 录制电脑内部声音 老妈喜欢跳广场舞&#xff0c;现在广场舞音频下载都收费了&#xff01;没办法&#xff0c;只能自己录歌了&#xff0c;外录有杂音大家也都知道&#xff0c;所以就只能采用内录的方式然后再用 Audition 调整一下音量大小。 一、&#xff08;前置条件&a…...