数组题解

本文探讨了多种处理数组的方法,包括动态扩容、排序及消除重复元素。详细介绍了四种思路:边输入边扩容并判断、先扩容后排序查重、使用固定长度数组关联数字与计数、以及直接在输入时消除重复。每种策略都涉及数组存储、判断、排序等操作。
摘要由CSDN通过智能技术生成

思路一:边输入边判断边对数组进行扩容存储,最后输出
数据:存储数字的数组nums 存储次数的数组counts
步骤:
1.获取一个数字
2.判断该数字
    2.1 如果是0 则跳出循环
    2.2 如果不是
        当前数字是否在nums中
            在 相应counts位置++
            不在 nums扩容将数字传进去 counts扩容 1次数
3.排序nums 同时counts也要排序

import java.util.Scanner;
class Demon01_1{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        int[] nums=new int[0];  //存储数字的数组开始是没有的
        int[] counts=new int[0];//存储次数的数组开始也是没有的,是随着nums增加的
        System.out.print("请输入数字:"); 
        while(true){
            int number=scanner.nextInt(); //接受用户输入
            if(number==0){  //输入的为0则跳出循环
                break;
            }
             //获取number的角标 -1 !-1
            int index=indexOf(nums,number);
            if(index!=-1){          //角标为不为-1,number已存在nums中
                counts[index]++;    //相对应的次数++
            }else{                  //不存在 将number加入nums中 同时计数
                nums=addNum(nums,number);   
                counts=addCount(counts);
            }
        }
         //对结果进行排序
        sort(nums,counts); //输出
        for(int i=0;i<nums.length;i++){
            System.out.println(nums[i]+" occurs "+counts[i]+(counts[i]>1?" times":" time"));
        }
    }
         //在排序nums的过程中 nums的元素要进行交换 同时对应的counts的元素进行交换,这里选择插入排序
    public static void sort(int[] nums,int[] counts){
        for(int i=1;i<nums.length;i++){
            int e=nums[i];           //将nums中相应的元素取出来
            int f=counts[i];        //附带将nums中元素出现的次数的数字也要取出来
            int j=i-1;
            while(j>=0&&nums[j]>e){
                nums[j+1]=nums[j];   //移动nums数组中的元素
                counts[j+1]=counts[j];  //附带也要移动相对应的次数
                j--;
            }
            nums[j+1]=e;        //确定nums中该元素的位置
            counts[j+1]=f;      //相应的计数在counts里面的位置也确定
        }
    }
            //向counts数组中加入新的次数默认为1
    public static int[] addCount(int[] counts){
        int[] arr=new int[counts.length+1];
        for(int i=0;i<counts.length;i++){
            arr[i]=counts[i];
        }
        arr[arr.length-1]=1; //每增加一个新的数字其出现的次数先置为1,并加在计数数组后面
        return arr;
    }
         //向nums数组中加入元素number
    public static int[] addNum(int[] nums,i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值