数组题目解析(一)

 题目分析:注意输入以0结束。先创建一个数组长度为0的新数组,将新数组进行扩容,在依次将用户输入的数据传入新数组中,每传进一个数,数组就要进行一次扩容,将数据全部读取到新数组中之后,再将数组进行排序,排序完毕之后再依次遍历数组判断数据的个数

import java.util.*;
class test1{
    public static void main(String[] args){
        /*
        思路一:数组长度不固定 读取数据 数组扩容 填入数据
        数据填入之后进行排序,然后遍历数组依次判断数据的个数
        思路二:计数排序的思想
         */
        Scanner s=new Scanner(System.in);
        int[] arr=new int[0];
        System.out.print("请输入数字");
        while(true){
            int num=s.nextInt();//将输入的数据传入到num里面
            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++){
            for(int j=i;j>0&&arr[j-1]>arr[j];j--){
                 int temp=arr[j-1];
                 arr[j-1]=arr[j];
                 arr[j]=temp;           
             }
        }
        
    }
    public static void show(int[] arr){
        System.out.println(Arrays.toString(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;
        }
    }
}

 题目分析:创建一个数组长度为10的数组,将10个数字依次传入数组,再创建一个数组长度为0的新数组,在新数组中查依次查找旧数组中的数据,若没有,先将新数组进行扩容,再将数据传入新数组

import java.util.*;
class test2{
    public static void main(String[] args){
        /*
        思路一  f1()
            在全部输入之后去重复
         */
         f1();
    }
    public static void f1(){
        //循环遍历数组进行赋值
        Scanner s=new Scanner(System.in);
        System.out.print("输入数据:");
        int[] arr=new int[10];//创建数组,长度为10
        for(int i=0;i<arr.length;i++){//遍历数组
            arr[i]=s.nextInt();//数组的赋值,将用户输入的数据依次传入数组arr
        }
        //开始对已有的数据进行去重复
        method1(arr);
    }
    public static void method1(int[] arr){
        int [] newArr=new int[0];//创建一个新的数组newArr,假设长度为0
        for(int i=0;i<arr.length;i++){//从角标0开始对原有的数组进行遍历
            if(!contains(newArr,arr[i])){//contain函数传newArr 在newArr中查arr 如果没有,那么先对数组进行扩容
                newArr=copyOf(newArr,newArr.length+1);
                newArr[newArr.length-1]=arr[i];//将i放进新数组中
            }
        }
        System.out.println(Arrays.toString(newArr));
    }
    public static boolean contains(int[] newArr,int key){
        for(int i=0;i<newArr.length;i++){
            if(newArr[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;
    }
}

 题目分析:排好序的条件是,不能出现左边数字大于右边数字,我们可以从这一点入手,如果出现左边数字大于右边数字,则没有排好序,反之排好序

import java.util.*;
class test3{
    public static void main(String[] args){
        Scanner s=new Scanner(System.in);
        System.out.print("输入数组");
        int len=s.nextInt();//获取的第一个数值为个数
        int[] arr=new int[len];//获取的数组长度为len
        for(int i=0;i<arr.length;i++){//数组中的数从角标0开始
            arr[i]=s.nextInt();//表示从角标0开始,依次将输入的数字放到数组里
        }
        //对数组进行有序的判断
        if(isSorted(arr)){
            System.out.println("这个数组已排序");
        }else{
            System.out.println("该数组没有排序好");
        }
    }
    public static boolean isSorted(int[] list){
        //如果不是升序的势必会有左大右小
        for(int i=1;i<list.length;i++){//角标从1,开始避免角标越界
            if(list[i-1]>list[i]){
                return false;
            }
        }
        return true;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值