挑战大厂:关于阿里的这些 Java 变态面试题目,你能回答上几个?
今日分享开始啦,请大家多多指教~
这篇文章简单给大家做了几个 java 数组算法例题,包括冒泡排序,选择排序,找最大值、最小值,添加、删除元素等。在面试中也会遇到的问题,是否有自己的答案。大家可以自己动手,把代码实现一下哦!
数组算法例题
1.数组逆序
第一个和最后一个互换,第二个和倒数第二个互换,就相当于把数组像下图一样,进行对折互换,如果数组个数为奇数,则中间保持不变其余元素互换即可
数组展示:System.out.println(Arrays.toString(arr));
2.找出数组中最大值所在下标位置
因为是找下标位置所以可以先定义一个值为数组下标,直接使用 数组[下标] 方式进行比较
3.找出数组中指定元素第一次出现的下标位置
分析
第一次出现位置
如果有多个重复元素
有可能不存在指定元素
4.在数组中找出指定下标对应的元素
分析:有可能不存在指定的索引
5.找出指定元素在数组中最后一次出现位置
和找出第一个方法差不多
tips:
既然是找最后一个数字,可以倒序查找,提高效率
判断找不到的情况
一定要注意,for 循环判断 i < array.length 不是小于等于,因为是从 0 开始
6.找到元素在指定数组中的所有下标位置
要求:
不允许在方法内打印展示
考虑多个数据情况
需要在方法外获取到下标数据信息
不允许使用数组作为返回值
思考 1:
保存查询数据的下标位置一定会用到数组
保存下标的数组数据类型是 int 类型
解决:
另外使用一个数组,作为形式参数,传递首地址,使用此数组存放下标位置,因为是传递的地址,可以直接更改数组内容,并不需要返回数组的值
思考 2:
需要考虑保存下标的数组容量
解决:
返回值数组容量和原数组容量一致,这样即使数组内元素值一致且被选中,也可以存储下来
思考 3:
返回值,怎么表示,用什么类型数据
new 创建一个新的数组,int 类型数组中,所有元素初始值都是 0,用什么判断元素索引
解决:
返回找到的元素个数,没有则返回 0
7.在指定位置插入指定元素
方法分析:
public static 不要问
返回值类型:
void 可用,但不建议
boolean 可以 true false 选择 boolean 类型
int 可用 返回值的含义约束较为麻烦
方法名
add 添加操作
形式参数列表
需要插入数据的数组
指定插入数据的下标位置
指定插入的数据
(int[] arr,int index,int insert);
方法声明
public static boolean add(int[] arr,int index,int insert);
在数组指定位置添加元素,指定位置后面的依次往后移一位,最后一个 0 就是要被挤掉的,可以从后向前进行循环操作
核心代码
全部代码
超出数组会溢出
8.删除数组中指定下标的元素
和添加元素基本一致,逻辑变为从删除位置开始之后的元素都往前移一位,直接覆盖掉要删除位置元素
核心代码
0 代表无效元素,占位使用
全部代码
9.冒泡排序算法
首先要明白一点,形参是引用传值,传的是数组的首地址,操作的还是原来的数组
for 循环示意图,也就是 10 个数两两比较,需要 9 次可以找出一个最大值,并且将最大值放到最后边
i 表示外部即第一层循环控制循环次数
j 表示内部即第二层循环控制那些数两两间进行比较
i=0 时,j 要循环 9 次,找出最大值放到最后,下一次循环时最大值就不需要再管了
i=1 时,因为已经找到了最大值,所以这次 j 循环八次就可以了
i 和 j 的对应关系: j = 数组长度 -1 - i
为啥要减 1:因为 10 个数两两比较,仅需要比较九次
源码如下
排序效果
10.选择排序
选择排序基本想法是:比如有 10 个数,最大值在每次循环前初始化设置为数组第 1 个元素的值即 array[0],然后与数组的其他剩余元素进行比较,所以比较次数就是数组总元素-1,10 个数循环 9 次就可以找到最大值,最大值和本次最后的项位置进行互换
在 i=1 时,因为已经找到一个最大值并且放到最后了,所以 j 可以少循环依次
j = 数组的长度-i-1
i = 1 时
效果展示
选择排序相较于冒泡排序来说要快一些,选择排序的时间复杂度为 n(n-1)/2,而冒泡排序为 O(n^2),一般建议选择排序,当然还有其他更好的排序方法。
小结
简单和大家说下数组的内容,数据类型,告知编译器,当前数组中能够保存的数据类型是什么,定义之后,整个数组中保存的数据类型不能修改,操作数据非常重要。
今日份分享已结束,请大家多多包涵和指点!
评论