数组的一些基础题

简介: 数组的一些基础题

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. 谢谢观看哟~

目录
相关文章
|
Java 大数据 API
用上myexcel,百万数据导出也不怕
用上myexcel,百万数据导出也不怕
564 0
|
11月前
|
安全 自动驾驶 物联网
新四化驱动,如何构建智能汽车的“全场景”可进化互联网络?
在智能化、电动化、网联化、共享化的时代浪潮中,汽车正从单纯的 “机械产品” 进化为先进的 “移动智能终端”。在软件定义汽车(SDV)的崭新时代,每一次 OTA 升级的顺利完成、每一秒自动驾驶的精准决策、每一帧车载娱乐交互的流畅呈现,都离不开一张实时响应、全域覆盖、安全可靠的广域网络。
|
人工智能 移动开发 机器人
智能体 | 快速构建专属英语口语陪练助手,这下雅思再也不用愁了
智能体是以云为基础、AI为核心的智能系统,不同于通义千问等AI工具,用户可自建专注于特定领域的智能体,如英语口语陪练助手。通过阿里云百炼平台,开通服务、创建智能体、选择模型、设计Prompt并测试优化,最终发布到多渠道。用户能随时随地进行英语口语练习,提升语言能力。
|
SQL Java 数据库
微服务技术系列教程(39)- SpringBoot -RBAC权限模型
微服务技术系列教程(39)- SpringBoot -RBAC权限模型
631 0
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
类加载过程
(1)加载 :加载字节码文件,将字节码中的静态变量和常量转换到方法区中,在堆中生成class对象作为方法区入口 (2)连接: 验证:验证字节码文件的正确性。 准备:正式为类变量在方法区中分配内存,并设置初始值。 解析:将符号引用(如类的全限定名)解析为直接引用(类在实际内存中的地址)。()
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
255 0
|
iOS开发
iOS开发:城市选择器集成
该项目集成了三种类型的城市选择器: 1、XXCityPickerView 省市区,可以分级:1省 2省-市 3省-市-区 2、SQSelectAddress 省市区乡/镇,页面跳转 3、RattanCityPicker 省市区,包含邮编地址,开放多个属性设置的接口
585 0
iOS开发:城市选择器集成
Re8:读论文 Hier-SPCNet: A Legal Statute Hierarchy-based Heterogeneous Network for Computing Legal Case
Re8:读论文 Hier-SPCNet: A Legal Statute Hierarchy-based Heterogeneous Network for Computing Legal Case
Re8:读论文 Hier-SPCNet: A Legal Statute Hierarchy-based Heterogeneous Network for Computing Legal Case
|
JSON JavaScript 数据格式
基于 el-form 封装一个依赖 json 动态渲染的表单控件
先介绍功能,然后演示功能,最后介绍思路和编码方式。
715 0
基于 el-form 封装一个依赖 json 动态渲染的表单控件

热门文章

最新文章