程序表经典面试题

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