java算法面试题_Java算法面试题汇总

article/2025/9/15 13:24:23

原标题:Java算法面试题汇总

8a16adcf5f4df4c738e417bf3787868a.png

1. 字符串

如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。

toCharArray() // 获得字符串对应的char数组

Arrays.sort() // 数组排序

Arrays.toString(char[] a) // 数组转成字符串

charAt(int x) // 获得某个索引处的字符

length() // 字符串长度

length // 数组大小

2. 链表

在Java中,链表的实现非常简单,每个节点Node都有一个值val和指向下个节点的链接next。

class Node {

int val;

Node next;

Node(int x) {

val = x;

next = null;

}

}

链表两个著名的应用是栈Stack和队列Queue。

栈:

class Stack{

Node top;

public Node peek(){

if(top != null){

return top;

}

return null;

}

public Node pop(){

if(top == null){

return null;

}else{

Node temp = new Node(top.val);

top = top.next;

return temp;

}

}

public void push(Node n){

if(n != null){

n.next = top;

top = n;

}

}

}

队列:

class Queue{

Node first, last;

public void enqueue(Node n){

if(first == null){

first = n;

last = first;

}else{

last.next = n;

last = n;

}

}

public Node dequeue(){

if(first == null){

return null;

}else{

Node temp = new Node(first.val);

first = first.next;

if(last == temp) last = first;

return temp;

}

}

}

3. 树

这里的树通常是指二叉树,每个节点都包含一个左孩子节点和右孩子节点,像下面这样:

class TreeNode{

int value;

TreeNode left;

TreeNode right;

}

下面是与树相关的一些概念:

平衡 vs. 非平衡:平衡二叉树中,每个节点的左右子树的深度相差至多为1(1或0)。

满二叉树(Full Binary Tree):除叶子节点以为的每个节点都有两个孩子。

完美二叉树(Perfect Binary Tree):是具有下列性质的满二叉树:所有的叶子节点都有相同的深度或处在同一层次,且每个父节点都必须有两个孩子。

完全二叉树(Complete Binary Tree):二叉树中,可能除了最后一个,每一层都被完全填满,且所有节点都必须尽可能想左靠。

4. 排序

下面是不同排序算法的时间复杂度,你可以去wiki看一下这些算法的基本思想。

AlgorithmAverage TimeWorst TimeSpace

冒泡排序n^2n^21

选择排序n^2n^21

Counting Sortn+kn+kn+k

Insertion sortn^2n^2

Quick sortn log(n)n^2

Merge sortn log(n)n log(n)depends

5. 递归 vs. 迭代

对程序员来说,递归应该是一个与生俱来的思想(a built-in thought),可以通过一个简单的例子来说明。

问题: 有n步台阶,一次只能上1步或2步,共有多少种走法。

步骤1:找到走完前n步台阶和前n-1步台阶之间的关系。

为了走完n步台阶,只有两种方法:从n-1步台阶爬1步走到或从n-2步台阶处爬2步走到。如果f(n)是爬到第n步台阶的方法数,那么f(n) = f(n-1) + f(n-2)。

步骤2: 确保开始条件是正确的。

f(0) = 0;

f(1) = 1;

public static int f(int n){

if(n <= 2) return n;

int x = f(n-1) + f(n-2);

return x;

}

递归方法的时间复杂度是n的指数级,因为有很多冗余的计算,如下:

f(5)

f(4) + f(3)

f(3) + f(2) + f(2) + f(1)

f(2) + f(1) + f(1) + f(0) + f(1) + f(0) + f(1)

f(1) + f(0) + f(1) + f(1) + f(0) + f(1) + f(0) + f(1)

直接的想法是将递归转换为迭代:

public static int f(int n) {

if (n <= 2){

return n;

}

int first = 1, second = 2;

int third = 0;

for (int i = 3; i <= n; i++) {

third = first + second;

first = second;

second = third;

}

return third;

}

6. 动态规划

动态规划是解决下面这些性质类问题的技术:

一个问题可以通过更小子问题的解决方法来解决(译者注:即问题的最优解包含了其子问题的最优解,也就是最优子结构性质)。

有些子问题的解可能需要计算多次(译者注:也就是子问题重叠性质)。

子问题的解存储在一张表格里,这样每个子问题只用计算一次。

需要额外的空间以节省时间。

爬台阶问题完全符合上面的四条性质,因此可以用动态规划法来解决。

public static int[] A = new int[100];

public static int f3(int n) {

if (n <= 2)

A[n]= n;

if(A[n] > 0)

return A[n];

else

A[n] = f3(n-1) + f3(n-2);//store results so only calculate once!

return A[n];

责任编辑:


http://chatgpt.dhexx.cn/article/vQotupaY.shtml

相关文章

详解单调队列算法

前言 嘿!彩蛋!感觉有帮助就三连呗! 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 在上一篇文章中,我们介绍了「单调栈」这一最常考察的线性数据结构。而今天我们将继续沿着这个思路,介绍另…

栈和队列相关经典算法题总结(数据结构+C语言)

我们这里针对栈和队列的一些经典算法题做详细讲解: 1.括号匹配问题. 2.用队列实现栈. 3.用栈实现队列. 4.设计循环队列. 一.详细讲解如下: 1.括号匹配问题.(如下图) 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &am…

qt使用消息队列服务器,qt代码实现消息队列通信

qt代码实现消息队列通信 内容精选 换一换 HBase 1.X版本在RPC流程中&#xff0c;多个数据通信线程会争抢同一个缓存Buffer队列&#xff0c;代码以lock重入锁实现线程安全&#xff0c;锁抢占严重&#xff0c;导致HBase不能充分发挥CPU多核的能力。HBase 1.X版本的RPC通信机制中B…

消息队列MQ常见面试题

面试官在面试候选人时&#xff0c;如果发现候选人的简历中写了在项目中使用了 MQ 技术&#xff08;如 Kafka、RabbitMQ、RocketMQ&#xff09;&#xff0c;基本都会抛出一个问题&#xff1a;在使用 MQ 的时候&#xff0c;怎么确保消息 100% 不丢失&#xff1f; 这个问题在实际…

RabbitMQ消息队列常见面试题总结

1、什么是消息队列&#xff1a; 1.1、消息队列的优点&#xff1a; &#xff08;1&#xff09;解耦&#xff1a;将系统按照不同的业务功能拆分出来&#xff0c;消息生产者只管把消息发布到 MQ 中而不用管谁来取&#xff0c;消息消费者只管从 MQ 中取消息而不管是谁发布的。消息…

【消息队列】面试题及答案整理

消息队列面试题 为什么要使用消息队列/消息队列的应用场景使用了消息队列会有什么缺点如何保证消息队列是高可用的RocketMQ是如何保证消息队列是高可用的 如何保证消息不被重复消费/如何保证消息消费的幂等性如何保证消费的可靠性传输RocketMQ如何保证消费的可靠性传输RabbitMQ…

JAVA——快速排序(详细)

JAVA快速排序的实现 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高&#xff0c;因此经常被采用&#xff0c;再加上快速排序思想----分治法也确实实用&#xff0c;因此很多软件公司的笔试面试&#xff0c;包括像腾讯&#xff0c;微软等知名IT公司都喜欢考这个&…

快速排序算法(java实现)

基本思想 快速排序是一种采用分治法解决问题的一个典型应用&#xff0c;也是冒泡排序的一种改进。它的基本思想是&#xff0c;通过一轮排序将待排记录分割成独立的两部分&#xff0c;其中一部分均比另一部分小&#xff0c;则可分别对这两部分继续进行排序&#xff0c;已达到整…

java快速排序(含快速排序代码)

目录 一&#xff1a;快速排序思想 二&#xff1a;快速排序代码&#xff08;pivot一定时先和arrays【r】先比较&#xff09; 三&#xff1a;结果 一&#xff1a;快速排序思想 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准…

快速排序 Java 实现

概念 快速排序&#xff08;Quicksort&#xff09;是对冒泡排序的一种改进。 参考: [数据结构与算法(Kotlin语言)]1.冒泡排序&#xff08;Bubble Sort&#xff09; 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略&#xff0c;通常称其为分治法(…

java快速排序详解

文章目录 一、快排原理二、实例操作三、实战代码四、总结 一、快排原理 从待排序区间选择一个数&#xff0c;作为基准值&#xff08;pivot&#xff09;&#xff1b;遍历整个待排序区间&#xff0c;将比基准值小的&#xff08;可等于&#xff09;放到基准值左边&#xff0c;将比…

快速排序Java

基本思想 快速排序的基本思想&#xff1a;通过一趟排序将待排记录分隔成独立的两部分&#xff0c;其中一部分记录的关键字均比另一部分的关键字小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序。 算法描述 快速排序使用分治法来把一个串&…

快速排序 Java模板

快速排序Java模板 详情参考 https://www.acwing.com/problem/content/787/ https://www.acwing.com/solution/content/2096/ 快速排序的整体过程&#xff0c;动态变化流程 以从小到大排序为例 选择一个目标参考值 p i v i t pivit pivit&#xff0c;通常课本上会说选择数组…

java 实现快速排序

1.介绍 快速排序是对冒泡排序的一种改进。它的基本思想是&#xff1a;通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一 部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排序 过程可以…

使用 Java 实现快速排序(详解)

一、概述 最近在看一些面试题&#xff0c;发现很多面试过程中都会要求手写快速排序&#xff0c;查阅一些博客发现别人写的并不是特别清楚而且也很难记住&#xff0c;所以为了更好的掌握这个算法&#xff0c;所以在这篇文章中&#xff0c;将自己的学习过程记录下来&#xff0c;…

【JAVA】快速排序

快排&#xff0c;和冒泡排序一样&#xff0c;是同一类型的排序&#xff0c;都是交换排序 交换&#xff0c;涉及在遍历中比较&#xff0c;然后相互交换元素 冒泡排序是根据趟数两两比较&#xff0c;边比较边交换&#xff0c;快排也一样&#xff0c;不过冒泡是以顺序表的格式进…

快速排序Java代码实现

代码实现&#xff08;附注释&#xff09; import java.util.Arrays;public class Main {public static void main(String[] args) {int[] arr {9, 3, 7, 3, 6, 5, 3, 2, 1, 0};System.out.println("排序前&#xff1a;");System.out.println(Arrays.toString(arr))…

java 算法之快速排序

1、快速排序是一种比较高效的排序算法&#xff0c;采用“分而治之”的思想&#xff0c;通过多次比较和交换来实现排序&#xff0c;在一趟排序中把将要排序的数据分成两个独立的部分&#xff0c;对这两部分进行排序使得其中一部分所有数据比另一部分都要小&#xff0c;然后继续递…

快速排序(java实现)

高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢&#xff1f;那就是“快速排序”啦&#xff01;光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数&#xff08;不要被这…

(论文阅读)图像超分辨率的回顾与展望

(论文阅读&#xff09;图像超分辨率的回顾与展望 1 引言2 超分辨率技术的分类2.1 多图像超分辨率2.2 视频超分辨率2.3 单图像超分辨率2.3.1 基于插值的单图像超分辨率算法2.3.2 基于重建模型的单图像超分辨率算法2.3.3 基于学习的单图像超分辨率算法 3 基于深度学习的单图像超分…