Java数组练习题


前言

本章是一些基础的数组练习题,由Java进行编译。

1、求数组中元素的平均值

给定一个整型数组, 求平均值

代码展示:

public static double avg(int[] array) {
       int sum = 0;
       for (int i = 0;i < array.length;i++) {   //array.length --> 数组长度
           sum = sum+array[i];
       }
       return sum*1.0 / array.length;
   }  ////此处1.0要注意   也可强制类型转换  return(double)sum / (double)arr.length

    public static void main(String[] args) {
        int[] array = {1,2,3,4,5,6};
        System.out.println(avg(array));
    }

运行结果:
在这里插入图片描述

2、查找数组中指定元素

1.顺序查找

给定一个数组, 再给定一个元素, 找出该元素在数组中的位置.

代码展示:

public static int search(int[] array,int key) {
        for (int i = 0; i < array.length; i++) {  
            if (array[i] == key) {
                return i;
            }
        }
        return -1;  //返回值 因为数组下标没有负数
    }
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        int index = search(array,4);   //(array,数字)输入你想找的数字的下标
        if (index == -1) {
            System.out.println("没有你要找的关键字!");
        }else {
            System.out.println("找到了你要的关键字,下标是:"+index);
        }
    }

运行结果:
在这里插入图片描述

2.二分查找

针对有序数组, 可以使用更高效的二分查找.

啥叫有序数组?
有序分为 “升序” 和 “降序”
如 1 2 3 4 , 依次递增即为升序
如 4 3 2 1 , 依次递减即为降序
以升序数组为例, 二分查找的思路是先取中间位置的元素, 然后使用待查找元素与数组中间元素进行比较:
1.如果相等,即找到了返回该元素在数组中的下标
2.如果小于,以类似方式到数组左半侧查找
3.如果大于,以类似方式到数组右半侧查找

在这里插入图片描述

代码展示:

public static int binarySearch(int[] array, int key) {
        int left = 0;
        int rigth = array.length - 1;
        while (left <= rigth) {
            int mid = (left + rigth) / 2;   
            if (array[mid] < key) {     
                left = mid + 1;        //从右侧区间继续找    
            }else if (array[mid] == key) {
                return mid;           //找到了
            }else {
                rigth = mid - 1;      //从左侧区间继续找
        }
    }
    return-1;     //返回值 因为数组下标没有负数
}

    public static void main(String[] args) {
        int[] array = {12,24,3,8,6};
        int index = binarySearch(array,8);  //输入数组中你想要找的数
        if (index == -1) {
            System.out.println("没有你要找的关键字!");
        }else {
            System.out.println("找到了你要的关键字,下标是:"+index);
        }
    }

运行结果:
在这里插入图片描述

如果是无序数组,可先将无序数组变为有序数组再使用二分法,这里用到的是Array.sort方法。

代码展示:

public static int binarySearch(int[] array, int key) {
        for (int i = 0; i < array.length; i++) {
            if (array[i] == key) {
                return i;
            }
        }
        return -1;  
    }

    public static void main(String[] args) {
        int[] array = {12,24,3,8,6};
        Arrays.sort(array);     //该方法排序主要为快速排序和优化的归并排序。
        System.out.println("排序之后的数组"+Arrays.toString(array));
        int index = binarySearch(array,8);
        if (index == -1) {
            System.out.println("没有你要找的关键字");
        }else {
            System.out.println("找到了你要的关键字,下标是"+index);
        }
    }

运行结果:
在这里插入图片描述

3、数组排序(完整冒泡排序逐级优化)

给定一个数组, 让数组升序 (降序) 排序.

动态图:
动态图

1.初级

代码展示:

public static void main(String[] args) {
        int[] array = {12, 24, 3, 8, 6};
        for (int i = 0; i < array.length - 1; i++) {     //[0--length-1)  i表示趟数
            for (int j = 0; j < array.length - 1 - i; j++) {  // -i表示了优化 可以不减
                if (array[j] > array[j + 1]) {    //判断大小
                    int temp = array[j];
                    array[j] = array[j + 1];    //这三条语句实现交换
                    array[j + 1] = temp;
                }
            }
        }
        System.out.println("从小到大排序的结果是");
        for (int i = 0; i < array.length; i++) {   //for循环实现依次打印每个数
            System.out.print(array[i] + " ");
        }

运行结果:
在这里插入图片描述

2.使用Array.toString简化

最后实现打印可以使用Array.toString方法
System.out.println("从小到大排序后的结果是: "+Arrays.toString(array));
使用时要在开头加 import java.util.Arrays; 自动导包不计
Array.toString方法实现的功能: (打印字符串)
在这里插入图片描述

代码展示:

public static void main(String[] args) {
        int[] array = {12, 24, 3, 8, 6};
        for (int i = 0; i < array.length - 1; i++) {    
            for (int j = 0; j < array.length - 1 - i; j++) {   
                if (array[j] > array[j + 1]) {   
                    int temp = array[j];
                    array[j] = array[j + 1];    
                    array[j + 1] = temp;
                }
            }
        }
       System.out.println("从小到大排序后的结果是: "+Arrays.toString(array));

运行结果:
在这里插入图片描述

3.完整冒泡排序

由于一些数组中的数字经过一次或者两次交换排序之后就结束了,所以就可以省略后面的交换比较过程。接下来使用一个if语句完成最佳的冒泡排序。

代码展示:

public static void main(String[] args) {
        int[] array = {12, 24, 3, 8, 6};
        for (int i = 0; i < array.length - 1; i++) {    
            boolean flg = false;    //布尔型(boolean)它的取值只能是常量true或者false
            for (int j = 0; j < array.length - 1 - i; j++) {    
                if (array[j] > array[j + 1]) {      
                    int temp = array[j];
                    array[j] = array[j + 1];  
                    array[j + 1] = temp;
                    flg = true; //打个比方 2 1 3 4 5 最开始flg=false 2大于1进行了一次交换之后
                }             //flg=true  之后2不大于3  不再进行交换
            }
            if (flg == false){
                break;
            }
        }
       System.out.println("从小到大排序后的结果是: "+Arrays.toString(array));

运行结果:
在这里插入图片描述

4、数组的逆序

给定一个数组, 将里面的元素逆序排列

设定两个下标, 分别指向第一个元素和最后一个元素. 交换两个位置的元素.
然后让前一个下标自增, 后一个下标自减, 循环继续即可

代码展示:

public static void reverse(int[] array) {
        int left = 0;
        int right = array.length-1;
        int tmp = 0;
        while (left < right) {
            tmp = array[left];
            array[left] = array[right];
            array[right] = tmp;
            left++;
            right--;
        }
    }

    public static void main(String[] args) {
        int[] array1 = {12,24,3,8,6};
        System.out.println("逆置之前的数组:"+ Arrays.toString(array1));
        reverse(array1);
        System.out.println("逆置之后的数组:"+ Arrays.toString(array1));

    }

代码过程:
在这里插入图片描述
运行结果:
在这里插入图片描述

<think>好的,我现在需要处理用户关于Java数组练习题的需求。用户希望得到示例、代码、题目和解析,所以我得先整理相关的资源。首先,看看用户提供的引用内容,引用3提到了数组逆序、插入、杨辉三角、顺序查找、二分查找、数组交集和寻找缺失数字等经典题目。引用4则是一个动态数组练习题,关于合并两个有序数组。用户可能对这类题目感兴趣,需要结合这些内容来生成问题。 接下来,我需要确保回答的结构清晰,符合用户的要求,包括示例代码和解析。可能还需要补充一些常见的数组练习题,比如数组去重、旋转数组、子数组和等,这样内容会更全面。同时,要注意每个题目都要有示例代码和解析,帮助用户理解。 还要检查代码的正确性,比如数组逆序可以通过双指针交换元素,杨辉三角需要正确计算每个位置的数值。合并有序数组的题目需要注意从后向前合并以避免覆盖元素,这点在引用4中提到的问题里很重要,需要详细说明。 另外,用户提到需要生成相关问题,可能需要包括每个练习题的扩展问题,比如时间复杂度的分析、不同解法的比较等。不过根据用户最后的示例,可能只需要列出相关问题,不需要详细展开,所以得在最后添加一个相关问题部分,比如关于优化、应用场景等。 需要确保所有数学公式使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$。虽然当前问题可能涉及数学较少,但如果有比如在查找最大数时计算时间复杂度,可能需要用到。 最后,引用用户提供的站内引用,特别是引用3和4,在回答中适当的位置添加引用标识,例如在提到数组逆序或合并数组时标注[^3][^4]。同时,确保使用中文回答,代码部分语法正确,符合Java规范。 总结步骤: 1. 整理用户提供的引用中的数组练习题。 2. 补充其他常见数组题目,确保多样性。 3. 每个题目给出问题描述、示例代码和解析。 4. 检查代码正确性和格式。 5. 添加相关问题部分。 6. 正确引用站内资料。</think>### Java数组经典练习题与解析 --- #### 1. 数组逆序 **题目**:将数组元素顺序反转。例如,输入$[1,2,3,4,5]$,输出$[5,4,3,2,1]$。 **示例代码**: ```java public static void reverseArray(int[] arr) { int left = 0, right = arr.length - 1; while (left < right) { int temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } ``` **解析**:通过双指针从两端向中间遍历,交换元素位置,时间复杂度为$O(n)$[^3]。 --- #### 2. 合并两个有序数组 **题目**:将有序数组`nums2`合并到`nums1`中,确保`nums1`仍有序。假设`nums1`有足够空间(例如初始长度为$m+n$)。 **示例代码**: ```java public void merge(int[] nums1, int m, int[] nums2, int n) { int i = m - 1, j = n - 1, k = m + n - 1; while (j >= 0) { if (i >= 0 && nums1[i] > nums2[j]) { nums1[k--] = nums1[i--]; } else { nums1[k--] = nums2[j--]; } } } ``` **解析**:从后向前填充,避免覆盖`nums1`原有元素,时间复杂度$O(m+n)$。 --- #### 3. 杨辉三角生成 **题目**:生成前$n$行的杨辉三角。例如,$n=5$时输出: ``` [1] [1,1] [1,2,1] [1,3,3,1] [1,4,6,4,1] ``` **示例代码**: ```java public List<List<Integer>> generatePascalTriangle(int n) { List<List<Integer>> result = new ArrayList<>(); for (int i = 0; i < n; i++) { List<Integer> row = new ArrayList<>(); for (int j = 0; j <= i; j++) { if (j == 0 || j == i) { row.add(1); } else { row.add(result.get(i-1).get(j-1) + result.get(i-1).get(j)); } } result.add(row); } return result; } ``` **解析**:每行首尾为$1$,中间元素为上一行相邻两数之和[^3]。 --- #### 4. 寻找缺失的数字 **题目**:在$0$到$n$的数组中查找缺失的一个数。例如,输入$[3,0,1]$,输出$2$。 **示例代码**: ```java public int missingNumber(int[] nums) { int sum = 0, n = nums.length; for (int num : nums) sum += num; return n * (n + 1) / 2 - sum; } ``` **解析**:利用高斯公式计算理论总和,减去实际总和即为缺失值,时间复杂度$O(n)$。 --- #### 5. 数组去重(原地) **题目**:原地删除有序数组中的重复项,返回新长度。例如,输入$[1,1,2]$,输出长度$2$,数组变为$[1,2]$。 **示例代码**: ```java public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int k = 0; for (int i = 1; i < nums.length; i++) { if (nums[i] != nums[k]) { nums[++k] = nums[i]; } } return k + 1; } ``` **解析**:双指针法,快指针遍历,慢指针标记非重复位置,时间复杂度$O(n)$。 ---
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小奕vi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值