国庆中秋特辑(七)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被写到…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
