题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据(用于不同的调查),希望大家能正确处理)。
注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。当没有新的输入时,说明输入结束。
输入描述:
注意:输入可能有多组数据(用于不同的调查)。每组数据都包括多行,第一行先输入随机整数的个数N,接下来的N行再输入相应个数的整数。具体格式请看下面的"示例"。
输出描述:
返回多行,处理后的结果
Me
- 排序
- 遍历排序后的数组,相邻两值不同则输出,相同则跳过。
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int num;
while (in.hasNext()) {
num = in.nextInt();
int [] l = new int [num];
ArrayList<Integer> arr = new ArrayList<Integer>();
for (int i=0; i<num; i++) {
arr.add(in.nextInt());
}
Collections.sort(arr);
int tmp = arr.get(0);
System.out.println(tmp);
for (int i=1; i<num; i++) {
if (tmp == arr.get(i)) continue;
else {
tmp = arr.get(i);
System.out.println(tmp);
}
}
}
}
题解
太绝了!
-
创建一个足够大的布尔值数组(1000);
-
用值定位,将定位到的位置的布尔值设置为true;
-
遍历布尔数组并输出值为true的index。
但是此法存在一个问题,每次都需要遍历1000,是否过于耗时?实际测试中该法的内存占用和时间都十分优秀。
此外引入sb的效率更高。
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
String str;
while((str=bf.readLine())!=null)
{
boolean[] stu=new boolean[1001];
StringBuilder sb=new StringBuilder();
int n=Integer.parseInt(str);
for(int i=0;i<n;i++)
stu[Integer.parseInt(bf.readLine())]=true;
for(int i=0;i<1001;i++)
if(stu[i])
sb.append(i).append("\n");
sb.deleteCharAt(sb.length()-1);
System.out.println(sb.toString());
}
}