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

以下是中高级Java软件工程师常见编程面试题,共有20道。
- 如何判断一个数组是否为有序数组?
答案:可以通过一次遍历,比较相邻元素的大小。如果发现相邻元素的大小顺序不对,则数组不是有序数组。
public boolean isSortedArray(int[] nums) { for (int i = 0; i < nums.length - 1; i++) { if (nums[i] > nums[i + 1]) { return false; } } return true;
}
- 如何删除一个有序数组中的重复元素?
答案:可以通过一次遍历,将相邻的重复元素删除。
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;
}
- 如何合并两个有序数组?
答案:可以通过一次遍历,将两个有序数组合并成一个新的有序数组。
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;
}
- 如何反转一个数组?
答案:可以通过一次遍历,将数组的每个元素翻转。
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; }
}
- 如何计算一个数组的平均值?
答案:将数组的所有元素相加,然后除以数组的长度。
public double averageArray(int[] nums) { long sum = 0; for (int num : nums) { sum += num; } return (double) sum / nums.length;
}
- 如何计算一个数组的中位数?
答案:将数组排序后,找到中间的元素。如果数组长度为偶数,则中间的两个元素的平均值是中位数。
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]; }
}
- 如何计算一个数组的众数?
答案:可以通过一次遍历,统计每个元素出现的次数。出现次数最多的元素是众数。
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;
}
- 如何计算一个数组的方差?
答案:将数组的所有元素相减后求平方,然后求和,最后除以数组的长度。
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;
}
- 如何计算一个数组的标准差?
答案:计算方差后,对方差开平方根。
public double standardDeviationArray(int[] nums) { double variance = varianceArray(nums); return Math.sqrt(variance);
}
- 如何判断一个字符串是否为回文字符串?
答案:可以通过两次遍历,比较字符串的前半部分和后半部分是否相同。
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;
}
- 如何删除一个字符串中的所有重复字符?
答案:可以通过一次遍历,将字符串中的每个字符添加到一个新的字符数组中,如果字符数组中没有该字符,则将该字符添加到字符数组中。最后将字符数组转换为字符串。
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);
}
- 如何合并两个字符串?
答案:可以通过一次遍历,将两个字符串中的字符合并到一个新的字符串中。
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();
}
- 如何计算两个字符串的编辑距离?
答案:可以通过动态规划的方法,计算将一个字符串转换为另一个字符串所需的最少操作次数。
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];
}
- 如何实现一个单例模式?
答案:可以使用懒汉式和饿汉式实现单例模式。
懒汉式:
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; }
}
- 如何实现一个工厂模式?
答案:创建一个工厂类,根据传入的参数创建相应的对象。
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"); }
}
- 如何实现一个观察者模式?
答案:创建一个观察者接口,一个主题接口,以及具体的观察者和主题类。当主题状态发生变化时,通知所有观察者。
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!"); } } }
}
- 如何实现一个策略模式?
答案:创建一个策略接口,以及具体的策略类。在运行时,根据不同的情况选择相应的策略来执行。
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"); } }
}
- 如何实现一个适配器模式?
实现适配器模式需要以下几个步骤:
- 确定目标接口:首先需要明确要适配的目标接口,即客户端期望使用的接口。这个接口可以是一个现有的接口,也可以是一个抽象的接口。
- 创建适配器类:创建一个适配器类,该类将实现目标接口,并在其内部包含一个被适配的类的实例。适配器类需要实现目标接口的所有方法,并在这些方法中调用被适配的类的相应方法。
- 实现目标接口:在适配器类中实现目标接口的所有方法,这些方法将被客户端使用。在实现这些方法时,需要将客户端传入的参数传递给被适配的类的相应方法,并将被适配的类的方法返回的结果返回给客户端。
下面是一个简单的适配器模式实现示例:
// 目标接口
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() 方法中调用了被适配的类 Adaptee 的 specificRequest() 方法。客户端代码通过目标接口 Target 使用适配器类 Adapter,实现了对被适配的类 Adaptee 的调用。
- 题目:汉诺塔问题
问题描述:请用 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); } }
}
- 题目:购物车类
问题描述:请设计一个购物车类,包含添加商品、删除商品、计算总价等功能。
答案:以下是一个简单的购物车类实现:
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软件工程师常见编程面试题,共有20道。 如何判断一个数组是否为有序数组? 答案:可以通过一次遍历,比较相邻元素的大小。如果发现相邻元素的大小顺序不对,则数组不是有序数组。 public boolean isSort…...
长剖与贪心+树上反悔贪心:1004T4
长剖的本质是一种贪心。(启发式合并本质也是类似哈夫曼树的过程) 在此题中,首先肯定变直径,然后选端点为根。然后选叶子。而每个叶子为了不重复计算,可以只计算其长剖后所在链的贡献。(本题精髓࿰…...
二叉树经典例题
前言: 本文主要讲解了关于二叉树的简单经典的例题。 因为二叉树的特性,所以关于二叉树的大部分题目,需要利用分治的思想去递归解决问题。 分治思想: 把大问题化简成小问题(根节点、左子树、右子树)&…...
什么是指针的指针和指向函数的指针?
理解指针的指针和指向函数的指针对于C语言初学者来说可能会有些挑战,但它们都是非常重要的概念,可以帮助你更好地理解和利用C语言的强大功能。在本文中,我将详细解释这两个概念,包括它们的概念、用途和示例。 指针的指针…...
多个excel合并
目的:将同一个文件下的多个 “京东差评.xlsx” 合并为一个:“京东汇总.xlsx" 代码如下: # -*- coding: utf-8 -*- """ Created on Wed Oct 4 12:52:32 2023author: 64884 """import pandas as pd impor…...
Integrity Plus for Mac,保障网站链接无忧之选
在如今数字化的时代,网站链接的完整性对于用户体验和搜索引擎排名至关重要。如果您是一位网站管理员或者经常需要检查网站链接的人,那么Integrity Plus for Mac(Integrity Plus)将成为您最好的伙伴。 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协议 请求: 应答: ARP协议: 0x0001 0x0800 6 4硬件类型:2个字节,arp协议不仅能在以太网上运行还能在其他类型的硬件上运行。以太网用1来表示; 协议类型:两字节。指的是a…...
【C++】STL详解(十)—— 用红黑树封装map和set
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C学习 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C】STL…...
Android学习之路(17) Android Adapter详解
Adapter基础讲解 本节引言 从本节开始我们要讲的UI控件都是跟Adapter(适配器)打交道的,了解并学会使用这个Adapter很重要, Adapter是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到view上,提供 给用户看…...
实验室超声波萃取技术的原理和特点是什么?
梵英超声(fanyingsonic)实验室超声波清洗机 超声波萃取中药材的优越性源于超声波的特殊物理性质。通过压电换能器产生的快速机械振动波,超声波可减少目标萃取物与样品基体之间的作用力,从而实现固液萃取分离。 (1)加速介质质点运…...
用Python操作Word文档,看这一篇就对了!
本文主要讲解Python中操作word的思路。 一、Hello,world! 使用win32com需要安装pypiwin32 pip install pypiwin32 推荐使用python的IDLE,交互方便 1、如何新建文档 from win32com.client import Dispatchapp Dispatch(Word.Application…...
力扣 -- 879. 盈利计划(二维费用的背包问题)
解题步骤: 参考代码: 未优化的代码: class Solution { public:int profitableSchemes(int n, int minProfit, vector<int>& group, vector<int>& profit) {//计划数int lengroup.size();//每一维都多开一行空间vector&…...
虚拟机的三种网络连接模式
文章目录 桥接模式NAT模式主机模式 桥接模式 虚拟系统占用主机网段中的一个IP地址,可以正常上网 NAT模式 主机生成一个非本主机的网段的IP的网卡,同时虚拟系统中使用一个该网段的IP地质,网络数据能通过主机的网卡来代理发送出去࿰…...
SQL调优
# 插入数据 页合并 # order by优化 视频教程:34. 进阶-SQL优化-order by优化_哔哩哔哩_bilibili 在创建索引的时候,如果没有设置顺序,是会默认升序的;但phone想要倒序,则需要额外的排序 根据需要,创建联合…...
python写一个开机启动的选项
创建一个Python脚本,以便用户可以选择在开机时启动它,可以使用pyautogui库来创建一个简单的交互式界面,其中用户可以选择是否将程序添加到开机启动项中 import pyautogui import osdef add_to_startup():# 提示用户选择是否要在开机时启动程序…...
1500*A. Boredom(DP)
Problem - 455A - Codeforces Boredom - 洛谷 解析: 首先统计每个数的个数,并且统计出最大值mx。 问题转换为,从1-mx 中选择任意个数字,使其都不相邻,求最大的总和。 开始没有思路,以为直接选取偶数位和奇…...
小程序关键词排名:优化你的应用在搜索中的地位
曾经,我们沉浸在应用商店的浩瀚海洋中,寻找着那个能够满足我们需求的小程序。而今,作为开发者,你的小程序究竟能否在这个无边的数字海洋中引起更多涟漪呢?故事的开始,恰巧就在这个问题的探寻中。让我们携手…...
OpenGLES:3D立方体纹理贴图
效果展示 一.概述 前几篇博文讲解了OpenGLES绘制多种3D图形,并赋予丰富的色彩,但是在这些3D图形绘制过程中,有一点还没有涉及,就是纹理贴图。 今天这篇博文我会用如下六张图片对立方体进行纹理贴图,实现六个面都是贴…...
线程的概述
#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能:创建一个子线程 参数: -thread:传出参数,线程创建成功后,子线程的ID被写到…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
