02数据结构和算法(Java描述)~数组的经典面试题

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;
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_41424688/article/details/106727457