数组(Array)习题总结

本文总结了关于数组的一系列编程题目,包括动态扩容数组、去重操作、数组排序、判断升序序列、查找连续相等数、合并有序数组、单词猜测游戏、二维数组特定列和对角线元素求和等,提供了多种解题思路和代码实现。
摘要由CSDN通过智能技术生成

学了关于数组的知识点,这次我们一起来看一些关于数组的编程题!

思路分析:这道题有两种思路,所以提供两种解法。思路一就是func1(),思路二是func2()。

思路一:题目当中读取的整数的个数不确定,即数组的长度不固定,所以我们需要每读取一个数据,然后进行数组扩容,再填入数据,数据填入之后再进行排序,最后遍历数组依次判断数据的个数。

第一步:获取用户输入的数据,动态的扩容数组填充数据;

第二步:按照输出结果,将数据中的数据进行排序;

第三步:输出连续相等的数字;

第四步:编写代码。

思路二:借助计数排序的思想,将数组固定起来,然后进行操作。具体来看代码:

import java.util.*;
class Demo05_01{
    public static void main(String[] args){
        /*
        思路1:数组长度不固定,需要读取一个数据,数组扩容,填入数据
        数据填入之后进行排序,然后遍历数组依次判断数据的个数
        连续相等
        2 2 2 2 3 3 4 4 4 4 5 5 6 6 6 6 7 7
        思路2:借助计数排序的思想,将数组固定起来。
        */
        //func1();
        func2();
    }
    public static void func2(){
        //arr[i] 就表示数字i出现的次数
        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){
                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;
        }
        //2.按照输出结果,将数据中的数据进行排序
        insertSort(arr);
        //3.输出连续相等的数字
        show(arr);
    }
    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;
        }
    }
    /*
    Arrays Math都是属于工具类
    Arrays 特殊的是数组的工具类
        toString(arr) 就是将数据的每个元素进行拼接 并返回拼接后的字符串数据
        "[1,2,3,4]"
    */
    public static void show(int[] arr){
        //System.out.println(Arrays.toString(arr));
        //此时就将问题转成了如何判断连续相等的数据分别出现多少次
        //[1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 6]
        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;
        }
    }
}

运行结果:

Enter the integers between 1 and 100:2 5 6 5 4 3 23 43 2 0
2 occurs 2 times
3 occurs 1 time
4 occurs 1 time
5 occurs 2 times
6 occurs 1 time
23 occurs 1 time
43 occurs 1 time

 

思路分析:这道题也有两个思路,所以提供两种解法。思路一就是func1(),思路二是func2()。

思路一:在10个数全部输入之后再去重复;

第一步:循环遍历数组进行赋值;

第二步:开始对已有的数据进行去重复操作,这一步又提供了三种方法,method1、method2、method3;

第三步:编写代码。

思路二:边输入边去重复。具体来看代码:

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 ten 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("The number of distinct number is: " + arr.length);
        System.out.println("The distinct numbers are: " + Arrays.toString(arr));
    }
    public static void func1(){
        //1.循环遍历数组进行赋值
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter ten 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++;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值