明明的随机数

https://www.nowcoder.com/practice/3245215fffb84b7b81285493eae92ff0?tpId=37&tqId=21226&tPage=1&rp=&ru=%2Fta%2Fhuawei&qru=%2Fta%2Fhuawei%2Fquestion-ranking

一、题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。

二、代码实现
1、使用数组

只用大小与输入规模相同的数组:

import java.util.Scanner;
import java.util.Arrays;
public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            //输入
            int n = sc.nextInt();
            int[] arr = new int[n];
            for (int i=0; i<n; i++) {
                arr[i] = sc.nextInt();
            }
            
            //排序
            Arrays.sort(arr);
 
            //去重 并 输出
            for (int i=0; i<arr.length; i++) {
                //对于第一个数字,直接输出; 对于i=2..len-1,则当前一个元素不与自己重复时输出
                if (i == 0 || arr[i] != arr[i-1]) {
                    System.out.println(arr[i]);
                }
            }
            
        }
        
    }
       
}
基于计数排序的思想:

关于计数排序可以参考以下链接:

https://www.cnblogs.com/bqwzx/p/11029264.html

https://baike.baidu.com/item/%E8%AE%A1%E6%95%B0%E6%8E%92%E5%BA%8F

由于输入随机数的取值范围为[1, 1000],于是申请一块空间为1001的数组arr,对于输入元素num,让arr[num] = 1。

import java.util.Scanner;
import java.util.Arrays;
public class Main {
   
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        int[] arr = new int[1001];
        while (sc.hasNext()) {
            int n = sc.nextInt();
            //int[] arr = new int[1001];
            //
            Arrays.fill(arr, 0);
 
            for (int i=0; i<n; i++) {
                int num = sc.nextInt();
                //if (arr[num] == 0) {
                    arr[num] = 1;
                //}
            }
 
            for (int i=0; i<1001; i++) {
                if (arr[i] == 1) {
                    System.out.println(i);
                }
            }
        }
        sc.close();
    }
    
}
2、使用集合

使用ArrayList:

输入时不插入已经存在的元素,也就是实现去重;遍历完成后,对集合进行排序

import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> list = new ArrayList<>();
        while (sc.hasNext()) {
            list.clear();
            
            int n = sc.nextInt();
            //输入时就去重
            for (int i=0; i<n; i++) {
                int num = sc.nextInt();
                if (!list.contains(num)) {
                    list.add(num);
                }
            }
            
            //排序
            Collections.sort(list);
            
            for (int i=0; i<list.size(); i++) {
                System.out.println(list.get(i));
            }
        }
    }
    
}
使用TreeSet:

利用TreeSet自带的按值排序插入、去重特性

import java.util.Scanner;
import java.util.TreeSet;
import java.util.Set;
import java.util.Iterator;
public class Main {
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //Set<Integer> set = new HashSet<>();
        //之所以不用HashSet,是因为HashSet没有排序方法,如ArrayList就有Collections.sort(ArrayList);
        //
        Set<Integer> set = new TreeSet<>();
        while (sc.hasNext()) {
            set.clear();
            
            int n = sc.nextInt();
            //输入时就去重,利用集合自身的去重特性;输入时就排序,利用TreeSet插入时维护值有序的特性
            for (int i=0; i<n; i++) {
                set.add(sc.nextInt());
            }
            
            Iterator<Integer> it = set.iterator();
            while (it.hasNext()) {
                System.out.println(it.next());
            }
        }
    }
  
}
————————————————
版权声明:本文为CSDN博主「JeremyChan1887」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_30973431/article/details/103948883

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值