国庆中秋特辑(七)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 来完成相应操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148614.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果)

一、声明 只实现物理反弹的效果&#xff0c;不实现蹦床会有的视觉拉伸效果&#xff0c;请自行找相关代码 二、实现 经过我的实践&#xff0c;我发现要想实现一个平台反弹的效果&#xff0c;要么就选择给player添加一个物理材质&#xff08;平台加了没用&#xff09;&#xff0…

arduino嵌入式1,LED闪烁案例

CVE系列在等等吧&#xff0c;环境我有点懒得搭建了 文章目录 前言一、anduino是什么玩意儿&#xff1f;二、使用步骤1.找蓝图/画蓝图2.写入数据成果 总结 前言 最近在学习嵌入式开发&#xff0c;我的单片机到了&#xff0c;然后我就沉迷于嵌入式开发的环境中 提示&#xff1a;…

Linux嵌入式学习之Ubuntu入门(六)shell脚本详解

系列文章内容 Linux嵌入式学习之Ubuntu入门&#xff08;一&#xff09;基本命令、软件安装、文件结构、编辑器介绍 Linux嵌入式学习之Ubuntu入门&#xff08;二&#xff09;磁盘文件介绍及分区、格式化等 Linux嵌入式学习之Ubuntu入门&#xff08;三&#xff09;用户、用户组…

go-fastdfs分布式文件存储集群搭建和测试

一、官方文件 https://sjqzhang.github.io/go-fastdfs/#character2、集群原理 小集群原理&#xff1a; 大集群原理 二、服务端集群部署 1、在集群每个节点机器上下载安装包 (建议使用最新稳定版本&#xff09; wget --no-check-certificate https://github.com/sjqzhang/go…

【Linux基础】Linux发展史

&#x1f449;系列专栏&#xff1a;【Linux基础】 &#x1f648;个人主页&#xff1a;sunny-ll 一、前言 本篇主要介绍Linux的发展历史&#xff0c;这里并不需要我们掌握&#xff0c;但是作为一个合格的Linux学习者与操作者&#xff0c;这些东西是需要了解的&#xff0c;而且…

docker基本命令

一、镜像操作 1、搜索镜像 docker search 仓库名/镜像名 2、下载镜像 docker pull 仓库名/镜像名&#xff1a;标签 若不指明标签&#xff0c;则表示下载最新版本的【标签为latest】 3、查看镜像 docker images 4、创建镜像 docker tag 原仓库/镜像名&#xff1a;原标名 新…

机器人制作开源方案 | 家庭清扫拾物机器人

作者&#xff1a;罗诚、李旭洋、胡旭、符粒楷 单位&#xff1a;南昌交通学院 人工智能学院 指导老师&#xff1a;揭吁菡 在家庭中我们有时无法到一些低矮阴暗的地方进行探索&#xff0c;比如茶几下或者床底下&#xff0c;特别是在部分家庭中&#xff0c;如果没有及时对这些阴…

【网络安全】2023年堡垒机品牌大全

随着大家网络安全意识的增加&#xff0c;随着国家等保政策的严格执行&#xff0c;越来越多的企业开始采购堡垒机。这里就给大家总结了部分堡垒机品牌&#xff0c;让大家参考参考。 2023年堡垒机品牌大全 1、行云堡垒 2、JumpServer 3、安恒 4、骞云 5、齐治 6、阿里云 …

【应用层协议】HTTPS的加密流程

文章目录 1. 认识HTTPS2. 密文3. HTTPS加密流程3.1 对称加密3.2 非对称加密3.3 证书 1. 认识HTTPS HTTPS&#xff08;超文本传输协议安全&#xff09;也是一个应用层协议&#xff0c;它是在HTTP协议的基础上引入了一个加密层。 也就是HTTP协议传输文本的方式是明文&#xff0c;…

【Docker Compose】Docker Compose 的安装,使用以及实现微服务集群的部署

文章目录 前言&#xff1a;Docker 部署存在的问题一、 初识 Docker Compose1.1 什么是 Docker Compose1.2 在 CentOS 上安装 Docker Compose 二、深入了解 Docker Compose 文件2.1 Docker Compose 文件概述2.2 Docker Compose 文件详解2.3 示例&#xff1a;编写 Docker Compose…

Flutter AI五子棋

前言 在上一篇文章中&#xff0c;讲解了如何实现双人在本地对战的五子棋&#xff0c;但是只有一个人的时候就不太好玩&#xff0c;同时博主也没有把五子棋相关的文章写过瘾。那么这篇文章&#xff0c;我们来实现一个功能更加丰富的五子棋吧&#xff01;在设计五子棋的算法方面&…

mysql5.7停止维护时间

mysql5.7将于2023年10月停止官网支持和更新&#xff1b;老项目要准备升级&#xff0c;新项目的mysql必须是mysql8.0&#xff08;2023-10&#xff09; 官方升级咨询地址 oracle官方升级咨询地址https://go.oracle.com/LP116153?elq_mid247718&sh1518132002061316121320310…

vue、vuex状态管理

使用步骤&#xff1a; 1、安装vuex 口诀&#xff1a;“233”、“344” 数字分别对应&#xff0c;“vue版本&#xff0c;vue 路由版本、vuex 版本”。 所以这里了使用vuex3版本&#xff1a; yarn add vuex3 2、创建仓库文件 编写如下&#xff1a; // 这个文件用于存放vuex的…

JAVA面经整理(7)

一)什么是AQS&#xff1f; 1)AQS也被称之为是抽象同步队列&#xff0c;它是JUC包底下的多个组件的底层实现&#xff0c;Lock&#xff0c;CountDownLatch和Semphore底层都使用到了AQS AQS的核心思想就是给予一个等待队列和同步状态来实现的&#xff0c;它的内部使用一个先进先出…

机器视觉工程师努力工作确实不一定涨工资,但是努力工作,确实有很大可能涨工资

机器视觉工程师努力工作确实不一定涨工资&#xff0c;但是努力工作&#xff0c;确实有很大可能涨工资 其实在我们机器视觉工程张薪资方面&#xff0c;正常是一年两次调整周期。

arm 汇编基础指令

实现1-100求和 .text .globl _start_start:mov r0, #1 i&#xff0c;i1mov r1, #100 条件变量i<100mov r2, #0 sumLoop: 循环cmp r0,r1 比较r0和r1的大小bhi stop 当r0>r1时&#xff0c;跳到stop标签a…

Android 中级控件

目录 一、图形定制1.1 图形Drawable1.2 形状图形1.3 状态列表图形 二、选择按钮2.1 复选框2.2 开关按钮2.3 单选按钮 三、文本输入3.1 编辑框3.2 焦点变更监听器3.3 文本变化监听器 四、对话框4.1 提醒对话框4.2 日期对话框4.3 时间对话框 一、图形定制 1.1 图形Drawable ~~~~…

苹果签名有多少种类之TF签名(TestFlight签名)是什么?优势是什么?什么场合需要应用到?

&#xff08;一&#xff09;TestFlight 能够让您&#xff1a;邀请内部和外部的测试人员为应用程序提供反馈。 跟踪应用程序在测试过程中发现的 bug 和用户体验问题。 收集 Crash 报告&#xff0c;了解应用程序在真实设备上的运行状况。 要使用 TestFlight&#xff0c;您可以按照…

基于Java的校园跑腿接单管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

jquery和jquery-ui拖动元素(vue2)

彩色小方块可以任意拖动&#xff0c;红色箭头指向的区域可以拖动 CDN在index.html文件中引入 <link rel"stylesheet" href"//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css"><script src"https://code.jquery.com/jquery-3.6.0.min…