02数据结构和算法(Java描述)~数组的经典面试题
本文是上一篇文章的后续,详情点击该链接
数组的反转
实现方案:
引入一个外部数组变量,用于保存反序后的数组,然后把原数组中的元素倒序保存于新创建的 数组中,新建数组保存的元素就是反转之后的结果。
代码实现
public static int[] reverseOrderArray(int[] arr) {
// 1.定义一个新数组,用于保存反转之后的结果
int[] newArr = new int[arr.length];
// 2.把arr数组中的所有元素倒序的存入newArr数组中
// 2.1通过循环获得arr数组中的每一个元素
for(int i = 0; i < arr.length; i++) {
// 2.2把arr数组中的元素倒序存入newArr数组中
newArr[arr.length - 1 - i] = arr[i];
}
// 3.把反转之后的数组返回
return newArr;
}
方案二:
直接对数组中的元素进行收尾交换。这样避免了新建一个数组来保存反转之后的结果,并且循 环遍历的次数也降为“实现方案一”的一半,从而提高了算法的效率。
代码实现
public static void reverseOrderArray2(int[] arr) {
// 1.通过循环,获得数组前半部分的元素
for(int i = 0; i < arr.length / 2; i++) {
// 2.把arr[i]和arr[arr.length - 1 - i]做交换
int temp = arr[i];
arr[i] = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = temp;
}
}
找数组中重复的元素
在一个长度为 n的数组里的所有元素都在[0,n-1]范围内。数组中某些元素是重复的,但不知道 有几个元素是重复的,也不知道每个元素重复几次。请找出数组中任意一个重复的元素。例如,如 果输入长度为 6的数组{0,2,4,1,4,3},那么输出重复的元素 4。 注意:数据不合法和找不到重复数据的情况,则输出-1即可。
思路分析:
从头到尾依次扫描数组中每一个元素。当扫描到第i个元素时,比较该位置数值 m是否等于i。 若是,接着扫描下一个元素;否则,将其与第m个元素进行比较。若相等,则返回该重复元素;否则,交换两个元素,继续重复前面的过程。
如果数组元素不重复,则每个元素和对应的索引值肯定相等,而我们要做的就是:把数组元素 放在正确的位置上面。
代码实现
public static int getRepeatNumber(int[] arr) {
// 1.判断arr为null或arr.length等于0的情况
if(arr == null || arr.length == 0) {
return -1;
}
// 2.通过循环,遍历数组中的所有元素
for(int i = 0; i < arr.length; ) {
// 3.判断数组元素是否合法
if(arr[i] < 0 || arr[i] >= arr.length) {
return -1;
}
// 4.处理arr[i]等于i的情况
if(arr[i] == i) {
i++; // 继续遍历数组中的下一个元素
}
// 5.处理arr[i]不等于i的情况
else {
// 5.1如果arr[i]和arr[arr[i]]相等,则证明找到了重复的元素
if(arr[i] == arr[arr[i]]) {
return arr[i];
}
// 5.2如果arr[i]和arr[arr[i]]不相等,则交换arr[i]和arr[arr[i]]的值
else {
int temp = arr[i];
arr[i] = arr[arr[i]];
arr[temp] = temp; // 切记
}
}
}
// 6.执行到此处,证明数组中就不存在重复的元素
return -1;
}
使奇数位于偶数前面
输入一个整型数组,实现一个方法来调整该数组中的元素的顺序,使得所有奇数位于数组的前 半部分,所有偶数位于数组的后半部分。
思路分析:
题目要求所有奇数都应该在偶数前面,所以我们应该只需要维护两个下标值,让一个下标值从 前往后遍历,另外一个下标值从后往前遍历,当发现第一个下标值对应到偶数,第二个下标值对应 到奇数的时候,我们就直接对调两个值。直到第一个下标到了第二个下标的后面的时候退出循环。
代码实现
public static void replaceOrderArray(int[] arr) {
// 1.处理arr为null的情况
if(arr == null)
throw new NullPointerException("空指针异常,arr:" + arr);
// 2.定义两个下标,min的初始值为0,max的初始值为arr.length - 1
int min = 0, max = arr.length - 1;
// 3.定义一个循环,用于调整数组中奇偶数的位置
while(min < max) { // 如果min小于max,则一直调整数组中元素的位置
// 4.让min从前往后找,如果arr[min]的值为偶数,则停止查找
while (min < max && arr[min] % 2 != 0) {
min++;
}
// 5.让max从后往前找,如果arr[max]的值为奇数,则停止查找
while(min < max && arr[max] % 2 == 0) {
max--;
}
// 6.如果min的值不等于max,则交换arr[min]和arr[max]的值
if(min != max) {
int temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
}
}