Java习题8

1.(计算数字的出现次数)编写程序,读取在1到100之间的整数,然后计算每个数出现的次数。
假定输人是以0结束的。

  • 解题思路:我们可以建立一个角标从0到100的数组arr[101],将数组的角标和输入的整数联系起来,比如用户输入非0且在1到100间的数字1,那么就让arr[1]加1,如果输入2,那么就让arr[2]加1,依次类推直到输入0时结束,将arr[]中不为零的数据和其角标一起输出即可
import java.util.Scanner;
class Demo01{
    public static void main(String[] args){
        //0 1 2 3 4 5 ~ 100
        //0 单独不算 懒一下 不想计算offset
        //arr[i] 就表示数字i出现的次数
        int[] arr=new int[101];
        Scanner scanner=new Scanner(System.in);
        System.out.print("Enter numbers:");
        while(true){
            int num=scanner.nextInt();
            if(num==0){
                break;
            }
            arr[num]++;    //使arr[]=arr[]+1
        }
        for(int i=0;i<arr.length;i++){
            if(arr[i]!=0){
                System.out.println(i+" occurs "+arr[i]+(arr[i]>1?" times":" time"));
            }
        }
    }
}

2.(打印不同的数)编写一个程序,读入10个数并且显示互不相同的数(即一个数出现多次,但仅显示一次)。(提示,读入一个数,如果它是一个新数,则将它存储在数组中。如果该数已经在数组中,则忽略它。)输人之后,数组包含的都是不同的数。

  • 解题思路:循环新建n(从1到10)长度的数组,每输入一个数就先判断数组中有没有相同的如果没有就将数存入数组
import java.util.*;
class Demo02{
    public static void main(String[] args){
        func();
    }
    
    public static void func(){        //输入函数
        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 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;
    }

}

3.(是否排好序了? )编写以下方法,如果参数中的1ist数组已经按照升序排好了,则返回true。public static boolean isSorted(int[] 1ist)
        编写一个测试程序,提示用户输人一个列表,显示该列表是否已经排好序。注意,输人中的第一个数表示列表中的元素个数。该数不是列表的一部分。

  • 解题思路:我们可以将数组挨个遍历去判断他相邻数是否左小右大
import java.util.*;
class Demo03{
    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]){    //从第二项开始,判断它是否小于它的前一项,是则返回false
                return false;
            }
        }
        return true;
    }

}

4.(合并两个有序列表)编写下面的方法,将两个有序列表合并成一个新的有序列表。
public static int[] merge(int[] list1, int[] list2)
       只进行list1. length+list2.length次比较来实现该方法。编写一个测试程序,提示用户输人两个有序列表,然后显示合并的列表。注意,输人的第一个数字表示列表中元素的个数。该数字不是列表的一部分。

  • 解题思路:我们可以新建一个list3,将list1和list2中的元素按顺序插入list3中
import java.util.*;
class Demo04{
    public static void main(String[] args){
        int[] list1={1,3,5,7,9};
        int[] list2={2,4,6,8,10};
        System.out.println(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++];        //p++,是先参与程序运行后+1
            }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;
    }
}

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值