顺序表经典面试题-数组的反转、找数组中重复的元素、使奇数位于偶数前面

顺序表经典面试题

1、反转数组

实现方案一

​ 引入一个外部数组变量,用于保存反序之后的数组,然后把原数组中的元素倒序保存于新创建的数组中,新建数组保存的元素就是反转之后的结果

public static void main(String[] args) {
    int[] arr = {11,22,33,44,55,66,77};
    int[] newArr = new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
        newArr[i] = arr[arr.length - 1 - i];
    }
    System.out.println(Arrays.toString(newArr));
}

实现方案二

​ 直接对数组中的元素进行首尾交换。这样避免了新建一个数组来保存反转之后的结果,并且循环遍历的次数也降为方案一的一半,提高了算法的效率

public static void main(String[] args) {
        int[] arr = {11,22,33,44,55,66,77};
//        int[] newArr = new int[arr.length];
        for (int i = 0; i < arr.length / 2; i++) {
//            newArr[i] = arr[arr.length - 1 - i];
            int temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;
        }
        System.out.println(Arrays.toString(arr));
    }

2、找数组中重复的元素

题目描述

​ 在一个长度为n的数组里的所有元素都在[0,n-1]范围内。数组中某些元素是重复的,但不知道有几个元素是重复的,也不知道每个元素重复了几次。请找出数组中任意一个重复的元素。例如,如果输入长度为6的数组{0,2,4,1,4,3},那么输出重复的元素4。

​ 注意:数据不合法或者找不到重复数据的情况,则输出-1即可。

思路分析

​ 从头到尾依次扫描数组中的每个元素。当扫描到第i个元素的时候,比较改位置数值m是否等于i。若是,接着扫描下一个元素。否则,将其与第m个元素进行比较。若相等,则返回该重复元素。否则,交换两个元素,继续重复前面的过程。

​ 如果数组元素不重复,则每个元素和对应位置的索引值肯定相等,而我们要做的就是:<u>把数组元素放在正确的位置上。</u>

代码实现

public static void main(String[] args) {
    int[] arr = {0,9,4,1,4,3};
    int repeatNumber = getRepeatNumber(arr);
    System.out.println(repeatNumber);
}
public static int getRepeatNumber(int[] arr){
    if (arr == null || arr.length == 0) return -1;
    for (int i = 0; i < arr.length;) {
        if (arr[i] < 0 || arr[i] >= arr.length) return -1;
        //数值m等于i,接着扫描下一个元素
        if (arr[i] == i) i++;
        else {
            //数值m与第m个元素比较,如果相等则返回该重复元素
            if (arr[i] == arr[arr[i]]) return arr[i];
            //把数组元素放在正确的位置上
            else {
                int temp = arr[i];
                arr[i] = arr[arr[i]];
                arr[temp] = temp;
            }
        }
    }
    return -1;
}

3、使奇数位于偶数前面

题目描述

​ 输入一个整型数组,实现一个方法来调整数组中元素的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

思路分析

​ 题目要求所有奇数都应该在偶数前面,所以我们应该只需要维护两个下标值,让一个下标值从前往后遍历,另外一个下标值从后往前遍历,当发现第一个下标值对应到偶数,第二个下标值对应到奇数的时候,我们就直接对调两个值。直到第一个下标到了第二个下标后面的时候退出循环。

代码实现

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5,6,7,8,9};
    replaceOrderArray(arr);
    System.out.println(Arrays.toString(arr));
}
public static void replaceOrderArray(int[] arr){
    //min从前往后,max从后往前
    int min = 0;
    int max = arr.length - 1;
    while (min < max){
        //min遇到偶数时跳出循环,max遇到奇数时跳出循环
        while (min < max && arr[min] % 2 != 0) min++;
        while (min < max && arr[max] % 2 == 0) max--;
        //交换奇数和偶数位置
        if (min != max){
            int temp = arr[min];
            arr[min] = arr[max];
            arr[max] = temp;
        }
    }
}
阅读 109

推荐阅读