数组习题

这篇博客介绍了数组相关的七道题目,涵盖了解法一func1()和func2(),涉及数组扩容、去重复、有序判断、随机路径生成、数组完全相同判断、连续相等数字检查以及有序数组合并。每题均提供了思路分析和结果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题

解法一func1():

分析:问题的难点在于数组长度不固定,需要读取一个数据,并且需要统计次数

          来一个数字加一个数字,那么就需要扩容了。然后填入数据,再进行排序。最后遍历数组依次判断数据的个数

          数组的扩容,就是创建一个新的数组,将元素赋值进去,将新数组的地址返回即可

          1.扩容:新建一个数组,将原先数组的值赋值进去,遍历小的数组,将小的数组的元素逐个按位置放到新的数组中。

          2.读取元素将数据存放到数组中

解法二func2():

          借助计数排序的思想,将数组固定起来。

Arrays 特殊的是数组的工具类,toString(arr) 就是将数据的每个元素进行拼接 并返回拼接后的字符串数据  "[1,2,3,4]"

import java.util.*;
class Demo05_01_01{
    public static void main(String[] args){
        //func1();
        func2();
    }
    public static void func2(){
        
        int[] arr = new int[101];
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the integers between 1 and 100:");
        while(true){
            int num = scanner.nextInt();
            if(num == 0){
                break;
            }
            arr[num]++;
        }
        for(int i = 0;i < arr.length;i++){
            if(arr[i] != 0){//arr[i] 就表示数字i出现的次数
                System.out.println(i + " occurs " + arr[i] + (arr[i] > 1?" times":" time"));
            }
        }
    }
    public static void func1(){
        //1.获取用户输入的数据 动态的扩容数组填充数据
        int[] arr = new int[0];
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter the integers between 1 and 100:");
        int num = 0;
        while(true){
            num = scanner.nextInt();
            if(num == 0){
                break;
            }
            if(num < 1 || num > 100){//验证用户输入数据的正确性
                System.out.println("有非法数据!");
                return;
            }
            arr = copyOf(arr,arr.length + 1);
            arr[arr.length - 1] = num;
        }
        insertSort(arr);//2.按照输出结果,将数据中的数据进行排序
        show(arr);//3.输出连续相等的数字
    }
    public static int[] copyOf(int[] arr,int newLen){
        int[] newArr = new int[newLen];
        for(int i = 0;i < arr.length;i++){
            newArr[i] = arr[i];
        }
        return newArr;
    }
    public static void insertSort(int[] arr){
        for(int i = 1;i < arr.length;i++){
            int e = arr[i];
            int j;
            for(j = i;j > 0 && arr[j - 1] > e;j--){
                arr[j] = arr[j - 1];
            }
            arr[j] = e;
        }
    }
    public static void show(int[] arr){
        for(int i = 0;i < arr.length;){
            int count = 1;
            for(int j = i + 1;j < arr.length;j++){
                if(arr[j] == arr[i]){
                    count++;
                }else{
                    break;
                }
            }
            System.out.println(arr[i] + " occurs "  + count + (count>1?" times":" time"));
            i+=count;
        }
    }
}

结果展示:

 

第二题

分析:这个题同样有两种解法

解法一func1():在全部输入之后去重复

                         1.循环遍历数组进行赋值

                         2.开始对已有的数据进行去重复操作

                         3.

解法二func2():边输入边去重复         

三种方法method1(arr):不创建额外空间 不许改变原先的顺序 

              method2(arr):插入排序 连续相等

              method3(arr):判断是否相等

import java.util.*;
class Demo05_02{
    public static void main(String[] args){
        /*
        思路1
            在全部输入之后去重复 func1
        思路2
            边输入边去重复 func2
        */
        // func1();
        func2();
    }
    public static void func2(){
        int[] arr=new int[0];
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter numbers:");
        for(int i=0;i<10;i++){
            int num=scanner.nextInt();
            if(!contains(arr,num)){
                arr=copyOf(arr,arr.length+1);
                arr[arr.length-1]=num;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
    public static void func1(){
        //1.循环遍历数组进行赋值
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter numbers:");
        int[] arr = new int[10];
        for(int i = 0;i < arr.length;i++){
            arr[i] = scanner.nextInt();
        }
        //2.开始对已有的数据进行去重复操作
        // 1 2 3 3 2 4 3 2 4 1
        // 1 2 3 4
        // method1(arr);        //空间S(n) 时间O(nm)
        // method2(arr);        //空间S(1) 时间O(n^2)
        // method3(arr);
    }
    public static void method3(int[] arr){
        //不创建额外空间 不许改变原先的顺序
        int i=0;
        int size=arr.length;
        while(i<size){
            for(int j=i+1;j<size;){
                if(arr[j]==arr[i]){
                    for(int k=j+1;k<size;k++){
                        arr[k-1]=arr[k];
                    }
                    size--;
                }else{
                    j++;
                }
            }
            i++;
        }
        for(i=0;i<size;i++){
            System.out.print(arr[i]+" ");
        }
    }
    public static void method2(int[] arr){
        //插入排序
        for(int i=1;i<arr.length;i++){
            int e=arr[i];
            int j;
            for(j=i;j>0&&arr[j-1]>e;j--){
                arr[j]=arr[j-1];
            }
            arr[j]=e;
        }
        //连续相等
        for(int i=0;i<arr.length;){ //O(n)
            System.out.print(arr[i]+" ");
            int count=1;
            for(int j=i+1;j<arr.length;j++){
                if(arr[j]==arr[i]){
                    count++;
                }else{
                    break;
                }
            }
            i+=count;
        }
    }
    public static void method1(int[] arr){
        int[] newArr=new int[0];
        for(int i=0;i<arr.length;i++){ //O(n)
            if(!contains(newArr,arr[i])){ //O(m)
                newArr=copyOf(newArr,newArr.length+1);
                newArr[newArr.length-1]=arr[i];
            }
        }
        System.out.println(Arrays.toString(newArr));
    }
    public static boolean contains(int[] arr,int key){
        for(int i=0;i<arr.length;i++){
            if(arr[i]==key){
                return true;
            }
        }
        return false;
    }
    public static int[] copyOf(int[] arr,int newLen){
        int[] newArr=new int[newLen];
        for(int i=0;i<arr.length;i++){
            newArr[i]=arr[i];
        }
        return newArr;
    }

}

结果展示:

 

 

第三题

分析:1.获取用户的输入 只不过第一个输入的数据时数据的个数(数组的长度)

           2.对数组进行有序的判断

           3.如果不是升序排列 那么势必会出现有一组数据 左大右小的情况,再进行判断

import java.util.*;
class Demo05_03{
    public static void main(String[] args){
        //1.获取用户的输入 只不过第一个输入的数据时数据的个数(数组的长度)
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter a list:");
        int len=scanner.nextInt();//获取的第一个数值就是数组的长度
        int[] arr=new int[len];
        for(int i=0;i<arr.length;i++){
            arr[i]=scanner.nextInt();
        }
        //2.对数组进行有序的判断
        if(isSorted(arr)){
            System.out.println("The list is already sorted.");
        }else{
            System.out.println("The list is not sorted.");
        }
    }
    public static boolean isSorted(int[] list){
        //如果不是升序排列 那么势必会出现有一组数据 左大右小的情况
        for(int i=1;i<list.length;i++){
            if(list[i-1]>list[i]){
                return false;
            }
        }
        return true;
    }

}

结果展示:

 

第四题

分析:

输入的数据:槽子的个数 球的个数=路径的个数

                     创建槽子的具体的容器int[]

                     每一个小球下落的路径L R 字符串

                    对于每一个小球而言其路径中的步骤是随机产生L R

    1.提示用户输入槽子的个数和小球的个数

    2.根据已有的槽子的个数去创建槽子容器

    3.根据已有的球和槽子的个数去随机创建一个小球下落的路径

    4.路径中经过几个钉子?路径的步骤有几步 和槽子的个数有关

    5.如何通过路径的经过得知最终所落入的槽子?

import java.util.*;
class Demo05_04{
    public static void main(String[] args){
        //1.
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter the number of balls to drop:");
        int balls=scanner.nextInt();
        System.out.print("Enter the number of slots in the bean machine:");
        int slots=scanner.nextInt();
        //2.
        int[] arr=new int[slots];
        //3.几个球几个路径path
        for(int i=0;i<balls;i++){
            String path=getPath(slots);
            System.out.println(path);
            //5.只要看当前路径中R的个数即可
            arr[getR(path)]++;
        }
        //6.输出
        System.out.println(Arrays.toString(arr));
        show(arr);
    }
    public static void show(int[] arr){
        int w=arr.length;
        int h=0;
        for(int i=0;i<arr.length;i++){
            if(arr[i]>h){
                h=arr[i];
            }
        }
        for(int i=h-1;i>=0;i--){
            for(int j=0;j<w;j++){
                if(i<arr[j]){
                    System.out.print("O");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

    }
    public static int getR(String path){
        int count=0;
        for(int i=0;i<path.length();i++){
            if(path.charAt(i)=='R'){
                count++;
            }
        }
        return count;
    }
    public static String getPath(int slots){
        //4.根据槽子的个数计算每一个球下落的路径
        Random random=new Random();
        String path="";
        for(int j=0;j<slots-1;j++){
            if(random.nextInt(2)==0){   //向左
                path+="L";
            }else{  //向右
                path+="R";
            }
        }
        return path;
    }
}

 结果展示:

 

第五题

分析:

判断两个数组是否完全相同

 1.先判断长度

2.再依次判断元素大小

class Demo05_05{
    public static void main(String[] args){
        int[] list1={1,2,3,4,5,6,7};
        int[] list2={1,2,3,4,5,7,6};
        System.out.println(equals(list1,list2));
    }
    public static boolean equals(int[] list1,int[] list2){
        if(list1.length!=list2.length){
            return false;
        }
        for(int i=0;i<list1.length;i++){
            if(list1[i]!=list2[i]){
                return false;
            }
        }
        return true;
    }
}

结果展示:

 

第六题

分析:解题步骤:根据用户输入的数字,判断是否有四个连续相等的数字,返回true或false

1.提示用户输入列表中数字的总数和具体的数字

2.判断列表中是否含有四个连续相等的数

import java.util.*;
class Demo05_06{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        //1.提示用户输入列表中数字的总数和具体的数字
        System.out.print("Enter the number of values:");
        int num = scanner.nextInt();
        int[] arr = new int[num];
        for(int i = 0;i < num;i++){
            arr[i] = scanner.nextInt();
        }
        //2.判断列表中是否含有四个连续相等的数
        if(isConsecutiveFour(arr) == true){
            System.out.println("The list has consecutive fours");
        }else{
            System.out.println("The list has no consecutive fours");
        }
    }
    public static boolean isConsecutiveFour(int[] arr){
        for(int i = 0;i < arr.length;){
            int count = 1;
            for(int j = i + 1;j < arr.length;j++){
                if(arr[i] == arr[j]){
                    count++;
                }else{
                    break;
                }
            }
            if(count >= 4){
                return true;
            }
            i+=count;
        }
        return false;
    }
}

结果展示:

 

第七题

分析:有序数组的合并,最主要的问题在于 数组之间有长有短。

1.先判断数组是否为空

2.如果都不为空,再考虑具体操作

import java.util.*;
class Demo05_07{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        //第一个数组list1
        System.out.print("Enter list1:");
        int len1 = scanner.nextInt();
        int[] list1 = new int[len1];
        for(int i = 0;i < list1.length;i++){
            list1[i] = scanner.nextInt();
        }
        //第二个数组list2
        System.out.print("Enter list2:");
        int len2 = scanner.nextInt();
        int[] list2 = new int[len2];
        for(int j = 0;j < list2.length;j++){
            list2[j] = scanner.nextInt();
        }
        System.out.println("The merged list is " + Arrays.toString(merge(list1,list2)));
    }
    /*
    有序数组的合并-最主要的问题在于 数组之间有长有短
    */
    public static int[] merge(int[] list1,int[] list2){
        if(list1 == null && list2 == null){
            return null;
        }
        if(list1 == null){
            return list2;
        }
        if(list2 == null){
            return list1;
        }
        //只有两个都不是null,再考虑具体操作
        int[] list3 = new int[list1.length + list2.length];
        int p1 = 0;
        int p2 = 0;
        int p3 = 0;
        while(true){
            if(p1 == list1.length && p2 == list2.length){
                break;
            }
            if(p1 < list1.length && p2 == list2.length){
                list3[p3++] = list1[p1++];
            }else if(p1 == list1.length && p2 < list2.length){
                list3[p3++] = list2[p2++];
            }else{
                if(list1[p1] <= list2[p2]){
                    list3[p3++] = list1[p1++];
                }else{
                    list3[p3++] = list2[p2++];
                }
            }
        }
        return list3;
    }
}

结果展示:

 

 

 

我们的例题就先说到这儿……

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值