Java面试:算法常用面试题汇总

1.说一下什么是二分法?使用二分法时需要注意什么?如何用代码实现?

二分法查找(Binary Search)也称折半查找,是指当每次查询时,将数据分为前后两部分,再用中值和待搜索的值进行比较,如果搜索的值大于中值,则使用同样的方式(二分法)向后搜索,反之则向前搜索,直到搜索结束为止。

二分法使用的时候需要注意:二分法只适用于有序的数据,也就是说,数据必须是从小到大,或是从大到小排序的。

解释

public class Lesson7_4 {public static void main(String[] args) {// 二分法查找int[] binaryNums = {1, 6, 15, 18, 27, 50};int findValue = 27;int binaryResult = binarySearch(binaryNums, 0, binaryNums.length - 1, findValue);System.out.println("元素第一次出现的位置(从0开始):" + binaryResult);}/*** 二分查找,返回该值第一次出现的位置(下标从 0 开始)* @param nums      查询数组* @param start     开始下标* @param end       结束下标* @param findValue 要查找的值* @return int*/private static int binarySearch(int[] nums, int start, int end, int findValue) {if (start <= end) {// 中间位置int middle = (start + end) / 2;// 中间的值int middleValue = nums[middle];if (findValue == middleValue) {// 等于中值直接返回return middle;} else if (findValue < middleValue) {// 小于中值,在中值之前的数据中查找return binarySearch(nums, start, middle - 1, findValue);} else {// 大于中值,在中值之后的数据中查找return binarySearch(nums, middle + 1, end, findValue);}}return -1;}
}

执行结果如下:

元素第一次出现的位置(从0开始):4

2.什么是斐波那契数列?用代码如何实现?

斐波那契数列(Fibonacci Sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711...... 在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。

斐波那契数列之所以又称黄金分割数列,是因为随着数列项数的增加,前一项与后一项之比越来越逼近黄金分割的数值 0.6180339887......

斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711......

斐波那契数列的特征 :第三项开始(含第三项)它的值等于前两项之和。

斐波那契数列代码实现示例,如下所示:

解释

public class Lesson7_4 {public static void main(String[] args) {// 斐波那契数列int fibonacciIndex = 7;int fibonacciResult = fibonacci(fibonacciIndex);System.out.println("下标(从0开始)" + fibonacciIndex + "的值为:" + fibonacciResult);}/*** 斐波那契数列* @param index 斐波那契数列的下标(从0开始)* @return int*/private static int fibonacci(int index) {if (index == 0 || index == 1) {return index;} else {return fibonacci(index - 1) + fibonacci(index - 2);}}
}

执行结果如下:

下标(从0开始)7的值为:13

3.一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子?请使用代码实现。

先来分析一下,本题目

  • 第一个月:有 1 对小兔子;
  • 第二个月:小兔子变成大兔子;
  • 第三个月:大兔子下了一对小兔子;
  • 第四个月:大兔子又下了一对小兔子,上个月的一对小兔子变成了大兔子;
  • ......

最后总结的规律如下列表所示:

月数123456789101112
幼仔对数1011235813213455
成兔对数01123581321345589
总对数1123581321345589144

可以看出,兔子每个月的总对数刚好符合斐波那契数列,第 12 个月的时候,总共有 144 对兔子。 实现代码如下:

解释

public class Lesson7_4 {public static void main(String[] args) {// 兔子的总对数int rabbitNumber = fibonacci(12);System.out.println("第 12 个月兔子的总对数是:" + rabbitNumber);}/*** 斐波那契数列* @param index 斐波那契数列的下标(从0开始)* @return int*/private static int fibonacci(int index) {if (index == 0 || index == 1) {return index;} else {return fibonacci(index - 1) + fibonacci(index - 2);}}
}

执行结果如下:

第 12 个月兔子的总对数是:144

4.什么是冒泡排序?用代码如何实现?

冒泡排序(Bubble Sort)算法是所有排序算法中最简单、最基础的一个,它的实现思路是通过相邻数据的交换达到排序的目的。

冒泡排序的执行流程是:

  • 对数组中相邻的数据,依次进行比较;
  • 如果前面的数据大于后面的数据,则把前面的数据交换到后面。经过一轮比较之后,就能把数组中最大的数据排到数组的最后面了;
  • 再用同样的方法,把剩下的数据逐个进行比较排序,最后得到就是从小到大排序好的数据。

冒泡排序算法代码实现,如下所示:

解释

public class Lesson7_4 {public static void main(String[] args) {// 冒泡排序调用int[] bubbleNums = {132, 110, 122, 90, 50};System.out.println("排序前:" + Arrays.toString(bubbleNums));bubbleSort(bubbleNums);System.out.println("排序后:" + Arrays.toString(bubbleNums));}/*** 冒泡排序*/private static void bubbleSort(int[] nums) {int temp;for (int i = 1; i < nums.length; i++) {for (int j = 0; j < nums.length - i; j++) {if (nums[j] > nums[j + 1]) {temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}System.out.print("第" + i + "次排序:");System.out.println(Arrays.toString(nums));}}
}

执行结果如下:

排序前:[132, 110, 122, 90, 50]
第1次排序:[110, 122, 90, 50, 132]
第2次排序:[110, 90, 50, 122, 132]
第3次排序:[90, 50, 110, 122, 132]
第4次排序:[50, 90, 110, 122, 132]
排序后:[50, 90, 110, 122, 132]

5.什么是选择排序?用代码如何实现?

选择排序(Selection Sort)算法也是比较简单的排序算法,其实现思路是每一轮循环找到最小的值,依次排到数组的最前面,这样就实现了数组的有序排列。

比如,下面是一组数据使用选择排序的执行流程:

  • 初始化数据:18, 1, 6, 27, 15
  • 第一次排序:1, 18, 6, 27, 15
  • 第二次排序:1, 6, 18, 27, 15
  • 第三次排序:1, 6, 15, 27, 18
  • 第四次排序:1, 6, 15, 18, 27

选择排序算法代码实现,如下所示:

解释

public class Lesson7_4 {public static void main(String[] args) {// 选择排序调用int[] selectNums = {18, 1, 6, 27, 15};System.out.println("排序前:" + Arrays.toString(selectNums));selectSort(selectNums);System.out.println("排序后:" + Arrays.toString(selectNums));}/*** 选择排序*/private static void selectSort(int[] nums) {int index;int temp;for (int i = 0; i < nums.length - 1; i++) {index = i;for (int j = i + 1; j < nums.length; j++) {if (nums[j] < nums[index]) {index = j;}}if (index != i) {temp = nums[i];nums[i] = nums[index];nums[index] = temp;}System.out.print("第" + i + "次排序:");System.out.println(Arrays.toString(nums));}}
}

执行结果如下:

排序前:[18, 1, 6, 27, 15]
第0次排序:[1, 18, 6, 27, 15]
第1次排序:[1, 6, 18, 27, 15]
第2次排序:[1, 6, 15, 27, 18]
第3次排序:[1, 6, 15, 18, 27]
排序后:[1, 6, 15, 18, 27]

6.什么是插入排序?用代码如何实现?

插入排序(Insertion Sort)算法是指依次把当前循环的元素,通过对比插入到合适位置的排序算法。 比如,下面是一组数据使用插入排序的执行流程:

  • 初始化数据:18, 1, 6, 27, 15
  • 第一次排序:1, 18, 6, 27, 15
  • 第二次排序:1, 6, 18, 27, 15
  • 第三次排序:1, 6, 18, 27, 15
  • 第四次排序:1, 6, 15, 18, 27

插入排序算法代码实现,如下所示:

解释

public class Lesson7_4 {public static void main(String[] args) {// 插入排序调用int[] insertNums = {18, 1, 6, 27, 15};System.out.println("排序前:" + Arrays.toString(insertNums));insertSort(insertNums);System.out.println("排序后:" + Arrays.toString(insertNums));}/*** 插入排序*/private static void insertSort(int[] nums) {int i, j, k;for (i = 1; i < nums.length; i++) {k = nums[i];j = i - 1;// 对 i 之前的数据,给当前元素找到合适的位置while (j >= 0 && k < nums[j]) {nums[j + 1] = nums[j];// j-- 继续往前寻找j--;}nums[j + 1] = k;System.out.print("第" + i + "次排序:");System.out.println(Arrays.toString(nums));}}
}

执行结果如下:

排序前:[18, 1, 6, 27, 15]
第1次排序:[1, 18, 6, 27, 15]
第2次排序:[1, 6, 18, 27, 15]
第3次排序:[1, 6, 18, 27, 15]
第4次排序:[1, 6, 15, 18, 27]
排序后:[1, 6, 15, 18, 27]

7.什么是快速排序?用代码如何实现?

快速排序(Quick Sort)算法和冒泡排序算法类似,都是基于交换排序思想实现的,快速排序算法是对冒泡排序算法的改进,从而具有更高的执行效率。

快速排序是通过多次比较和交换来实现排序的执行流程如下:

  • 首先设定一个分界值,通过该分界值把数组分为左右两个部分;
  • 将大于等于分界值的元素放到分界值的右边,将小于分界值的元素放到分界值的左边;
  • 然后对左右两边的数据进行独立的排序,在左边数据中取一个分界值,把小于分界值的元素放到分界值的左边,大于等于分界值的元素,放到数组的右边;右边的数据也执行同样的操作;
  • 重复上述操作,当左右各数据排序完成后,整个数组也就完成了排序。

快速排序算法代码实现,如下所示:

解释

public class Lesson7_4 {public static void main(String[] args) {// 快速排序调用int[] quickNums = {18, 1, 6, 27, 15};System.out.println("排序前:" + Arrays.toString(quickNums));quickSort(quickNums, 0, quickNums.length - 1);System.out.println("排序后:" + Arrays.toString(quickNums));}/*** 快速排序*/private static void quickSort(int[] nums, int left, int right) {int f, t;int ltemp = left;int rtemp = right;// 分界值f = nums[(left + right) / 2];while (ltemp < rtemp) {while (nums[ltemp] < f) {++ltemp;}while (nums[rtemp] > f) {--rtemp;}if (ltemp <= rtemp) {t = nums[ltemp];nums[ltemp] = nums[rtemp];nums[rtemp] = t;--rtemp;++ltemp;}}if (ltemp == rtemp) {ltemp++;}if (left < rtemp) {// 递归调用quickSort(nums, left, ltemp - 1);}if (right > ltemp) {// 递归调用quickSort(nums, rtemp + 1, right);}}
}

执行结果如下:

排序前:[18, 1, 6, 27, 15]
排序后:[1, 6, 15, 18, 27]

8.什么是堆排序?用代码如何实现?

堆排序(Heap Sort)算法是利用堆结构和二叉树的一些特性来完成排序的。 堆结构是一种树结构,准确来说是一个完全二叉树。完全二叉树每个节点应满足以下条件:

  • 如果按照从小到大的顺序排序,要求非叶节点的数据要大于等于,其左、右子节点的数据;
  • 如果按照从大到小的顺序排序,要求非叶节点的数据小于等于,其左、右子节点的数据。

可以看出,堆结构对左、右子节点的大小没有要求,只规定叶节点要和子节点(左、右)的数据满足大小关系。

比如,下面是一组数据使用堆排序的执行流程:

堆排序算法代码实现,如下所示:

解释

public class Lesson7_4 {public static void main(String[] args) {// 堆排序调用int[] heapNums = {18, 1, 6, 27, 15};System.out.println("堆排序前:" + Arrays.toString(heapNums));heapSort(heapNums, heapNums.length);System.out.println("堆排序后:" + Arrays.toString(heapNums));}/*** 堆排序* @param nums 待排序数组* @param n    堆大小*/private static void heapSort(int[] nums, int n) {int i, j, k, temp;// 将 nums[0,n-1] 建成大根堆for (i = n / 2 - 1; i >= 0; i--) {// 第 i 个节点,有右子树while (2 * i + 1 < n) {j = 2 * i + 1;if ((j + 1) < n) {// 右左子树小于右子树,则需要比较右子树if (nums[j] < nums[j + 1]) {// 序号增加 1,指向右子树j++;}}if (nums[i] < nums[j]) {// 交换数据temp = nums[i];nums[i] = nums[j];nums[j] = temp;// 堆被破坏,重新调整i = j;} else {// 左右子节点均大,则堆未被破坏,不需要调整break;}}}for (i = n - 1; i > 0; i--) {// 与第 i 个记录交换temp = nums[0];nums[0] = nums[i];nums[i] = temp;k = 0;// 第 i 个节点有右子树while (2 * k + 1 < i) {j = 2 * k + 1;if ((j + 1) < i) {// 右左子树小于右子树,则需要比较右子树if (nums[j] < nums[j + 1]) {// 序号增加 1,指向右子树j++;}}if (nums[k] < nums[j]) {// 交换数据temp = nums[k];nums[k] = nums[j];nums[j] = temp;// 堆被破坏,重新调整k = j;} else {// 左右子节点均大,则堆未被破坏,不需要调整break;}}// 输出每步排序结果System.out.print("第" + (n - i) + "次排序:");System.out.println(Arrays.toString(nums));}}
}

执行结果如下:

堆排序前:[18, 1, 6, 27, 15]
第1次排序:[18, 15, 6, 1, 27]
第2次排序:[15, 1, 6, 18, 27]
第3次排序:[6, 1, 15, 18, 27]
第4次排序:[1, 6, 15, 18, 27]
堆排序后:[1, 6, 15, 18, 27]

总结

对于应届毕业生来说,算法是大厂必考的一大重点科目,因为对于没有太多实际项目经验的应届生来说,考察的重点是逻辑思考能力和学习力,这两项能力的掌握情况都体现在算法上,因此除了本文的这些内容外,对于校招的同学来说还需要配合 LeeCode,来把算法这一关的能力构建起来,对于社招的同学来说,一般算法问到的可能性相对比较少,最常见的算法问题应该就是对冒泡和快排的掌握情况了,对于这两个算法来说,最好能到达手写代码的情况。

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

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

相关文章

螺栓拧紧角度如何检验?——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺栓拧紧角度检验方法是确保螺栓连接紧固可靠的关键步骤之一。正确的拧紧角度可以确保螺栓的预紧力达到要求&#xff0c;防止松动和失效。下面将详细介绍螺栓拧紧角度检验的步骤和注意事项。 一、螺栓拧紧角度的重要性 …

component-Echarts柱状图堆叠图与折线图的实现

1.效果 2.​​​​​代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>ECharts 实例</title><!-- 引入 echarts.js --><script src"https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js&…

探索存内计算—基于 SRAM 的存内计算与基于 MRAM 的存算一体的探究

CSDN存内社区招募&#xff1a;https://bbs.csdn.net/forums/computinginmemory 首个存内计算开发者社区&#xff0c;现0门槛新人加入&#xff0c;发文享积分兑超值礼品&#xff1b; 存内计算先锋/大使在社区投稿&#xff0c;可获得双倍积分&#xff0c;以及社区精选流量推送&a…

sql篇-内连接-左连接-右连接

内连接&#xff1a;表1 inner join 表2 on 条件 inner join join&#xff08;简写&#xff09; 查找&#xff1a;满足 匹配两个表条件的记录&#xff1a;student.s_id s.s_id(不匹配的记录不筛选) select * from student inner join score s on student.s_id s.s_id; 查询…

找第三方软件测评多久能拿到报告

随着软件市场的快速发展&#xff0c;用户对软件质量、性能和安全性的要求也越来越高。为了满足这些需求&#xff0c;许多企业和开发者选择寻求第三方软件测评机构的帮助。那么&#xff0c;找第三方软件测评多久能拿到报告呢&#xff1f;本文将从多个方面为您解析这一问题。 一…

【C++核心】面向对象的三大特性

面向对象的三大特性 一、封装性1. 封装性的意义1.1 表现事物1.2 权限控制1.3 成员属性设置为私有 2. 封装性的衍生知识2.1 struct和class区别2.2 友元2.2.1 全局函数做友元2.2.2 类做友元2.2.3 成员函数做友元 二、继承性1. 继承的语法2. 继承方式3. 继承中的对象模型3.1 说明3…

鸿蒙Next和鸿蒙4.0开发者如何选择

目录 一、 开头一句话重点落在鸿蒙原生开发&#xff0c;也就是ArkUI、Ability、ArkTS、ArkWeb、ArkData等。不管将来是鸿蒙Next2.0或者鸿蒙6.0都游刃有余。 二、 鸿蒙4.0与鸿蒙Next的共性共性概述详细分析总结 三、HarmonyOS Next与HarmonyOS 4的主要区别内核与兼容性设备与应用…

智能电视/盒子长文字输入困难?手把手教您解决这个难题!(电视盒子跨屏输入/打字,亲测有效!)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 解决方案 📒📝 方法一📝 方法二🎈 获取方式 🎈⚓️ 相关链接 ⚓️📖 介绍 📖 在使用智能电视/电视盒子的时候,会遇到这样一个场景:需要输入一个很长的网址,或者是想要粘贴一段很长的文字。如何使用遥控器要完成…

sqli-labs-master(Less1--Less5)

Sql-labs-master通关攻略_sqli-labs-master 全部通关-CSDN博客 sqli-labs-master靶场搭建&#xff0c;1-10关详解-CSDN博客 小白勇闯sqli-labs-master1-22关_sqlilabs第22关-CSDN博客 搭建靶场 靶场&#xff1a; GitHub - Audi-1/sqli-labs: SQLI labs to test error base…

浅谈成为程序员后我明白的道理

当我成为程序员后&#xff0c;我明白了以下几点&#xff1a; 编程是一门持续学习的技能&#xff1a;作为程序员&#xff0c;我意识到编程是一个不断发展和变化的领域。新的编程语言、框架和技术不断出现&#xff0c;需要不断学习和适应。我意识到要持续学习新的知识和技能&…

机器学习—特征预处理和降维(四)

什么是特征预处理&#xff1f; 通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程 1包含内容 数值型数据的无量纲化&#xff1a; 归一化标准化 2特征预处理API sklearn. preprocessing为什么要进行归一化 or 标准化&#xff1f; 特征的单位或者大小相差较大…

学习了解大模型的四大缺陷

由中国人工智能学会主办的第十三届吴文俊人工智能科学技术奖颁奖典礼暨2023中国人工智能产业年会于2024年4月14日闭幕。 会上&#xff0c;中国工程院院士、同济大学校长郑庆华认为&#xff0c;大模型已经成为当前人工智能的巅峰&#xff0c;大模型之所以强&#xff0c;是依托了…

请警惕,这10本期刊已被SCI剔除,部分涉嫌灌水

科睿唯安于4月15日更新了SCIE、SSCI、AHCI、ESCI四大数据库最新收录期刊目录。 2024年第一版——2024年1月24日更新 2024年第二版——2024年2月19日更新 2024年第三版——2024年3月18日更新 2024年第四版——2024年4月15日更新 本次目录中共收录期刊23368本。 【SCIE数据…

苹果开发初学者指南:Xcode 如何为运行的 App 添加环境变量(Environmental Variable)

概览 Xcode 15 在运行 SwiftUI 代码时突然报告如下警告&#xff1a; Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem. 不仅如此…

react之useState详解

1. 为什么要用useState&#xff1f; 它是React 16.8 的新特性&#xff0c;我们在React里面一般都是用Class去写组件&#xff0c;但是有时候会发现不用它更方便&#xff0c;但是问题来了&#xff1a;不用Class的时候&#xff0c;数据的状态改变如何存储呢&#xff1f;如果你用 …

数据结构-堆详解

堆 图片&#xff1a; 二叉堆的父节点为这个子树的最值。 如何维护它。 我们发现它是一棵二叉树&#xff0c;那就自然满足若父节点为 x x x 则左儿子节点为 x 2 x\times2 x2 右儿子为 x 2 1 x\times 2 1 x21 这是显然的&#xff0c;但如果写成指针或结构体就太麻烦了&…

Redis的特性与安装

回顾 Redis是一个在内存中存储数据的中间件&#xff0c;可以用来当数据库用&#xff0c;也可以作为缓存用(这里的缓存往往是对数据库缓存)。 中间件&#xff1a;和业务无关的服务&#xff0c;功能更加通用&#xff0c;如&#xff1a;数据库&#xff0c;缓存&#xff0c;消息队…

【笔试强训】Day1 --- 数字统计 + 两个数组的交集 + 点击消除

文章目录 1. 数字统计2. 两个数组的交集3. 点击消除 1. 数字统计 【链接】&#xff1a;数字统计 解题思路&#xff1a;模拟&#xff0c;利用数学知识&#xff0c;计算每个数字中2出现的个数。&#xff08;这里也可以将数字转换成字符串来统计字符’2’出现的个数&#xff09…

如何使用Flask搭建web程序框架并实现无公网IP远程访问本地程序

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

bonding原理分析和问题排查

bonding原理 发送端&#xff1a; 使用网卡bond3模式&#xff08;广播模式BOND_MODE_BROADCAST&#xff09;将报文从两个网卡同时发出&#xff0c;无需修改报文。 接收端&#xff1a; 根据发送节点时间的链路通断状态&#xff0c;接收端设置一条线路为活动线&#xff0c;另一条…