明明的随机数
程序员文章站
2022-04-04 20:13:43
...
Description
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
Input
包含多组测试数据,每组测试数据占2行。
第1行为1个正整数,表示所生成的随机数的个数:N
第2行有N个用空格隔开的正整数,为所产生的随机数。
Output
每组测试数据占2行。
第1行为1个正整数M,表示不相同的随机数的个数。
第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
Sample Input
10
20 40 32 67 40 20 89 300 400 15
Sample Output
8
15 20 32 40 67 89 300 400
- 第一种(最笨的思路,时间复杂度高)
import java.util.Scanner;
public class homework {
public static void Random(){//自己写的思路,效率低,时间复杂度高
Scanner sc=new Scanner(System.in);
System.out.println("input:");
int n=sc.nextInt();
int radom[]=new int[100];
int count=0;
for(int i=0;i<n;i++){
radom[i]=(int)(1+Math.random()*1000);//生成了N个1到1000之间的随机整数
System.out.print(radom[i]+" ");
}
System.out.println(" ");
for(int j=0;j<n;j++){//去重
int key=radom[j];
for(int k=j+1;k<n;k++){
if(key==radom[k]){
radom[k]=0;
}
}
if(radom[j]!=0)
count++;
}
for(int j=0;j<n;j++){//选择排序
int min=j;
int temp;
for(int k=j+1;k<n;k++){
if(radom[min]>radom[k]){
min=k;
}
}
temp=radom[j];
radom[j]=radom[min];
radom[min]=temp;
}
System.out.println(count);
for(int i=0;i<n;i++){
if(radom[i]!=0)
System.out.print(radom[i]+" ");
}
}
public static void main(String[] args){
Wrandom();
}
}
运行截图:
2.第二种(巧妙地利用了数组的特性,时间复杂度低,但是是空间换时间,所以当数组过大,不建议使用)
import java.util.Scanner;
public class homework {
public static void Wrandom(){//定义一个1001长度的数组,每次把生成的值放到对应下标的位置,只能放一次,数组本就是顺序的,所以最后肯定是去重和顺序的,但不适合数组太大的,浪费空间
int radom[]=new int[1001];
int count=0;
Scanner sc=new Scanner(System.in);
System.out.println("input:");
int n=sc.nextInt();
for(int i=0;i<n;i++){//将随机生成的数字保存到对应的数组下标里面
int temp=(int)(1+Math.random()*1000);
System.out.print(temp+" ");
if(radom[temp]==0){
count++;
}
radom[temp]=temp;
}
System.out.println("");
System.out.println(count);
for(int i=1;i<1001;i++){ //输出的结果为去重和排序的
if(radom[i]!=0)
System.out.print(radom[i]+" ");
}
}
public static void main(String[] args){
Wrandom();
}
}
运行截图:
你学会了哪种呢,加油哦!
上一篇: 怎么重启mysql数据库
下一篇: jquery如何验证输入的是否为中文