数组的一些基础题

简介: 数组的一些基础题

1. 找出一个数组中的最大值



public class Test {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        System.out.println(maxNum(array));
    }
    public static int maxNum(int[] array){
        if(array == null) return -1;
        if(array.length == 0) return -1;
        int max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(max < array[i]){
                max = array[i];
            }
        }
        return max;
    }
}


输出结果:


cfa893cbcea24cd484349ec70c6c7c8b.png


2. 找到数组中指定的元素,使用二分法查找,条件:有序数组



public class Test {
    public static void main(String[] args) {
        int[] arr = {1,2,3,4,5,6,7,8,9};
        int key = 8;
        System.out.println( find(arr, key) );
    }
    public static int find(int[] arr, int key){
        int left = 0;
        int right = arr.length - 1;
        while(left <= right){
            int mid = (left + right) / 2;
            if(arr[mid] < key){
                left = mid + 1;
            } else if (arr[mid] > key) {
                right = mid - 1;
            }else {
                return mid;//返回的是数组的下标
            }
        }
        return -1;
    }
}


输出结果:


ddf0b4b2c16c41979a651da85513cbf5.png


分析:


5e9c60495a7749c0b3ea7c97dcc0b0fc.png




3. 检查数组的有序性



//检查是否升序
public class Test {
    public static void main(String[] args) {
        int[] arr = {1,3,5,7,2};
        System.out.println( isup(arr) );
    }
    public static boolean isup(int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            if(arr[i] > arr[i + 1]){
                return false;
            }
        }
        return true;
    }
}


输出结果:


546e5c841e7a444cbd1876743fbbb8d2.png



4. 冒泡排序



public class Test {
    public static void main(String[] args) {
        int[] arr = {5,2,1,3,4 };
        for (int i = 0; i < arr.length - 1; i++) {
           int flag = 0;
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if(arr[j] > arr[j + 1]){
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = 1;
                }
            }
            if(flag == 0){
                break;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}


分析:


通过变量 i 和 j 来控制范围。其中 i 表示拿到数组中的每个元素,j 表示每个元素与其他元素比较的趟数。flag == 0,说明已经满足升序,可以跳出循环了,没必要继续遍历下去。感兴趣的读者可以加个计数器测试一下,感受一下有无 flag 的差异。


9101953dde7e4c18a24819bd20b9b4dd.jpg


5. 数组逆序



import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        int[] arr = { 1,2,5,8,9,0,4,3 };
        int[] arr2 = { 1,2,5,8,10,9,0,4,3 };
        reverse(arr);
        System.out.println(Arrays.toString(arr));
        reverse(arr2);
        System.out.println(Arrays.toString(arr2));
    }
    public static void reverse(int[] arr){
        int left = 0;
        int right = arr.length - 1;
        while(left <= right){
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }
    }
}


输出结果:


2cd71f2b9e0446648d4f6c8df87663ea.png


分析:


1483faaac2334bebb1225df0c9cf9e52.jpg


6. 调整数组,使得奇数位于偶数之前,不考虑顺序



方法一:


public class Test {
    public static void main(String[] args) {
        int[] arr = {1,0,2,3,4,8,5,6,9,7};
        swap(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void swap(int[] arr){
        int left = 0;
        int right = arr.length - 1;
        while(left <= right){
            //如果数组左边是偶数,数组右边是奇数,那么就交换
            if(arr[left] % 2 == 0 && arr[right] % 2 != 0) {
                int temp = arr[left];
                arr[left] = arr[right];
                arr[right] = temp;
            }
            //如果找到的是奇数,就往后跳
            if(arr[left] % 2 != 0){
                left++;
            }
            //如果找到的是偶数,就往前跳
            if(arr[right] % 2 == 0){
                right--;
            }
        }
    }
}


输出结果:


4db767e3ce7544e5a040f885f59617b7.png


方法二:


public class Test {
    public static void main(String[] args) {
        int[] arr = {1, 0, 2, 3, 4, 8, 5, 6, 9, 7};
        adjust(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void adjust(int[] arr) {
        int left = 0;
        int right = arr.length - 1;
        while (left < right) {
            while (arr[left] % 2 != 0 && left < right) {
                left++;
            }
            while (arr[right] % 2 == 0 && left < right) {
                right--;
            }
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
    }
}


输出结果:


3b76eb013a6b4108b53656dcd6a6db16.png




分析:


19f6418e5e7c4cb4ace9460981568a81.jpg


7. 调整数组,使得奇数位于偶数之前,并分别让奇数和偶数变成升序



方法一:


直接对原数组进行操作,不开辟新的空间。


public class Test {
    public static void main(String[] args) {
        int[] arr = {1,0,2,3,4,8,5,6,9,7};
        adjust(arr);
        System.out.println(Arrays.toString(arr));
        System.out.println("------------------------------");
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
    //1. 调整数组使得奇数位于偶数之前
    public static void adjust(int[] arr){
        int left = 0;
        int right = arr.length - 1;
        while(left<right){
            while(arr[left] % 2 != 0 && left<right){
                left++;
            }
            while(arr[right] % 2 == 0 && left<right){
                right--;
            }
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
    }
    public static void sort(int[] arr){
        int sign = 0;
        for (int i = 0; i < arr.length; i++) {
            //找到偶数位,并记录下来
            if(arr[i] % 2 == 0){
                sign = i;
                break;
            }
        }
        //2. 对于数组前一段的奇数进行升序
        for (int i = 0; i < sign - 1; i++) {
            for (int j = 0; j < sign - 1 - i; j++) {
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        //3. 对于数组后一段的偶数进行升序
        //这里应该注意j的范围,因为j的终止范围并不好计算,所以直接置成 arr.length - 1
        for (int i = sign; i < arr.length - 1; i++) {
            for (int j = sign; j < arr.length - 1; j++) {
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
}


输出结果:


c309699f3d7144388469e1e278099187.png


方法二:


① 拆分数组

② 排序数组

③ 合并数组


import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        int[] arr = { 1,0,2,3,4,8,5,6,9,7 };
        adjust(arr);
        System.out.println(Arrays.toString(arr));
        System.out.println("-------------------------------");
        int[] newArr = sort(arr);
        System.out.println(Arrays.toString(newArr));
    }
    //1. 调整数组使得奇数位于偶数之前
    public static void adjust(int[] arr){
        int left = 0;
        int right = arr.length - 1;
        while(left<right){
            while(arr[left] % 2 != 0 && left<right){
                left++;
            }
            while(arr[right] % 2 == 0 && left<right){
                right--;
            }
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
    }
    //2. 进行排序,返回一个新数组
    public static int[] sort(int[] arr){
        int sign = 0;
        for (int i = 0; i < arr.length; i++) {
            //找到偶数位,并记录下来
            if(arr[i] % 2 == 0){
                sign = i;
                break;
            }
        }
        //2.1 将数组 arr 分为两段,分别放至 newArr1 和 newArr2 中
        int[] newArr1 = new int[sign];
        int[] newArr2 = new int[arr.length-sign];
        System.arraycopy(arr,0,newArr1,0,newArr1.length);
        System.arraycopy(arr,sign,newArr2,0,newArr2.length);
        //2.2 进行排序
        Arrays.sort(newArr1);
        Arrays.sort(newArr2);
        //2.3 将 newArr1 和 newArr2 拷贝至 newArr 中
        int[] newArr = new int[arr.length];
        System.arraycopy(newArr1,0,newArr,0,newArr1.length);
        System.arraycopy(newArr2,0,newArr,sign,newArr2.length);
        return newArr;
    }
}


输出结果:


ff0c735cee064773a6ba7b9ab05f815f.png


f85a87d0dc0f41248366a4ce528bc32c.jpg


Over. 谢谢观看哟~

目录
相关文章
|
6月前
|
开发框架 .NET C#
c#数组补充
c#数组的几个简单的补充
26 0
|
3月前
|
存储 C++
关于数组的基本要点
关于数组的基本要点
34 0
|
9月前
数组的简单认识及其学习(二)
数组的简单认识及其学习(二)
42 0
|
6月前
|
JSON C# 数据格式
数组比较的几种方式
1、string.Equals() ```csharp string[] strList1= new string[3] {"1", "2", "3"}; string[] strList2= new string[3] {"4", "5", "6"}; if (!string.Equals(strList1, strList2)) { // 比较数组的不同之处 } // 涉及到修改日志输出等数组可以直接json序列化然后用上述方法比较即可,如下 if (!string.Equals(JsonConvert.SerializeObject(list1), JsonConvert
42 0
|
7月前
|
搜索推荐 编译器 C++
C++基础:第5~6章:数组\函数
C++基础:第5~6章:数组\函数
36 0
|
8月前
|
前端开发
前端——把一个数组添加到另一个数组里
前端——把一个数组添加到另一个数组里
|
9月前
|
C#
C#基础Ⅵ❷-数组
C#基础Ⅵ❷-数组
|
9月前
数组的简单认识及其学习(一)
数组的简单认识及其学习(一)
34 0
|
10月前
|
存储 编译器 程序员
C/C++(数组概念)
C/C++(数组概念)