思路一:边输入边判断边对数组进行扩容存储,最后输出
数据:存储数字的数组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