题目链接
题目描述
- 题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 - 输入描述
第 1 行为 1 个正整数,表示所生成的随机数的个数:N。
第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。 - 输出描述
输出 2 行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。
第 2 行为 M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 - 输入输出样例
示例一
输入
10
20 40 32 67 40 20 89 300 400 15
输出
8
15 20 32 40 67 89 300 400
题解思路(正文)
首先,看完题目描述就可以知道本题的核心算法就是排序和去重,只要解决了这两种要求,这道题也就迎刃而解了!
那首先我们可以解决一下排序的代码问题,这里有一定Java基础的小伙伴就会知道排序有多种方法:直接排序法、冒泡排序法等等,那么这里我用的是冒泡排序,代码及思路如下:
//冒泡排序
int temp=0;
//第一个循环是外循环,在一次内循环结束之后继续循环直至a<N-1,外循环结束,排序结束
for(int a=0;a<N-1;a++){
//第二个循环是内循环,遍历数组num[i],比较相邻两数之间的大小
for(int j=0;j<N-1;j++){
//假设前一个数大于后一个数,就将两者进行交换
if(num[j]>num[j+1]){
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
}
}
排序更新
使用Arrays.sort();方法可以直接排序,非常方便,这个方法用于字符串排序也是可以的,下面是排序的代码更新:
//注意使用这个方法的时候需要import一下:import java.util.Arrays;
Arrays.sort(num);
在完整代码中是定义了一个输入数组:num[N],完整代码将会在文章最后给大家展示。排序问题解决了之后就解决去重问题:代码和思路如下:
//去重:此去重方法是覆盖重复的数,当遍历数组遇到一样的数时,此数之后的每一个数都会往前挪一位,这样重复的数就会被覆盖
//按数组顺序逐个遍历,判断是否有相同的数,这里i<N-1是因为数组的最后一位在之前的遍历过程中已经比较过了
for(int i=0;i<N-1;i++){
for(int j=i+1;j<N;j++){ //这个for循环表示与num[i]之后的每个数进行比较
if(num[i]==num[j]){ //表示找到了一个相等的数
for(int a=j;a<N-1;a++){ //这个for循环表示当出现相同的数时,将此数之后的每一位数往前挪一位,覆盖重复的数,由此达到去重的目的
num[a]=num[a+1];
}
//如果不进行j--,去重后覆盖在相同数字上的数还未进行比较
j--;
//每当出现一个相同的数时,数组去重后,数组的长度N减一
N--;
}
}
}
排序和去重的代码和思路都在上面了,那么到这里有些小伙伴可能就会有一个疑问了,排序代码和去重代码有没有先后顺序呢?那么根据我自己的做题经验来说,根据我这一套代码思路,其顺序是有先后的:排序在前,去重在后,由于我自身能力有限,具体原因我还不知晓,在这里也希望可以解惑的小伙伴可以在评论区解惑一下,或者私信我也是可以滴!
不信的小伙伴也可以试一下,这里有一个示例是排序在后,去重在前会报错,不能通过的,示例如下:
30
120 40 321 677 40 321 67 40 20 89 301 407 15 499 440 240 89 301 407 515 40 321 67 40 20 89 301 407 15 499
完整代码
完整代码如下:
package com.company;
import java.util.Scanner;
public class lanqiao_suijishu {
public static void main(String[] args) {
// write your code here
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int []num = new int[N];
for(int i=0;i<N;i++){
num[i]= scan.nextInt();
}
/*
//冒泡排序
int temp=0;
for(int a=0;a<N-1;a++){
for(int j=0;j<N-1;j++){
if(num[j]>num[j+1]){
temp=num[j];
num[j]=num[j+1];
num[j+1]=temp;
}
}
}
*/
//Arrays.sort()方法排序
Arrays.sort(num);
//去重
for(int i=0;i<N-1;i++){
for(int j=i+1;j<N;j++){
if(num[i]==num[j]){
for(int a=j;a<N-1;a++){
num[a]=num[a+1];
}
j--;
N--;
}
}
}
System.out.println(N);
for(int i=0;i<N;i++){
System.out.print(num[i]+" ");
}
}
}
总结
以上就是我对该题的全部题解思路,欢迎大家在评论区交流。