zoukankan      html  css  js  c++  java
  • [编程题] 明明的随机数

    2/3 [编程题] 明明的随机数

    2/3 [编程题] 明明的随机数

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32M,其他语言64M
    

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

    Input Param

    n 输入随机数的个数

    inputArray n个随机整数组成的数组

    Return Value

    OutputArray 输出处理后的随机整数

    注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。

    样例输入解释:

    样例有两组测试

    第一组是3个数字,分别是:2,2,1。

    第二组是11个数字,分别是:10,20,40,32,67,40,20,89,300,400,15。

    输入描述:
    输入多行,先输入随机整数的个数,再输入相应个数的整数
    
    输出描述:
    返回多行,处理后的结果
    
    输入例子1:
    3
    2
    2
    1
    11
    10
    20
    40
    32
    67
    40
    20
    89
    300
    4000
    15
    
    输出例子1:
    1
    2
    10
    15
    20
    32
    40
    67
    89
    300
    400
    

    个人方法

    思路:

    1. 无序去重:
      • python: 元素可直接删除,故数组长度不断减少。
      • c++: 数组长度不变,去重后的长度用逻辑长度代替,即重复元素与(逻辑)序列末尾元素交换,并补0。
    2. 选择排序(升序)

    python:

    # !/usr/bin/env python2
    # -*- coding:utf-8 -*-
    '''
    Created on 2020年03月01日
    @author: oucbl
    '''
    # 选择排序(升序)
    def selection_sort(arr):
        n = len(arr)
    
        for i in range(n-1, 0, -1):
            flag = 0  # 最大值的位置
            for j in range(1, i+1):
                if arr[flag] < arr[j]:
                    flag = j
    
            # 交换
            max = arr[flag]
            arr[flag] = arr[i]
            arr[i] = max
    
            # print flag, max, arr # 测试结果
    
        return arr
    # 无序去重
    def deduplicate(arr, n):
        flag = 0   # 起始标志位
        while flag + 1 < n:
            for i in range(flag + 1, n):
                if arr[flag] == arr[i]:
                    arr.pop(i)  # 删除元素
                    n -= 1     # 长度减1
                    break     # 重新扫描
                if i == n-1 : flag += 1  # 完整的一次扫描
        return arr
    
    if __name__ == '__main__':
        N = input()   #  N个随机数
    
        arrays = []   #  初始随机列表
        for x in range(N):
            arrays.append(input())
        # print arrays
    
        # print selectionSort( deduplicate(arrays, N))
        for k in selection_sort( deduplicate(arrays, N)):
            print k
    
    

    c++:

    /*************************************************
    Author: oucbl
    Date: 2020.03.02
    **************************************************/
    #include <iostream>
    using namespace std;
    
    void selection_sort(int *, int); // 升序排序
    int deduplicate(int [], int);  // 无序去重
    
    
    int main()
    {
        int N;
        cin >> N;
    
        int *dnums = new int[N]; // 初始化数组
    
        for(int j=0; j < N; j++) // 遍历赋值
        {
            cin >> dnums[j];
        }
    
        // 先去重,后排序
        int len = deduplicate(dnums, N);
        selection_sort(dnums, len);
    
    //    cout << "len: " << len << endl;
        for(int j=0; j < len; j++) // 遍历输出
        {
            cout << dnums[j] << endl;
        }
    
        dnums = NULL;   // 赋值为空
        delete [] dnums; // 释放指针
        return 0;
    }
    
    // 无序去重; 返回去重后的长度
    int deduplicate(int dnums[], int N)
    {
        int lenth = N;  // 去重后的长度(逻辑长度)
        int flag = 0;   // 起始标志位
        while(flag + 1 < N )
        {
    		for(int i=flag +1; i < lenth; i++)
    		{
    			if (dnums[flag] == dnums[i])
    			{
    				dnums[i] = dnums[lenth-1]; //末尾非空值 覆盖/赋值 重复项
    				dnums[--lenth] = 0;   // 记录末尾非空值,非空长度减1
    				break;           // 跳出本次扫描
    			}
    
    			if(i == lenth - 1 ) //判断一次flag的完整扫描
    			{
    				flag ++;
    			}
    		}
    
    		if(flag == lenth -1)  // 判断所有flag的完整扫描
    		{
    			break;
    		}
    
    //		for(int j=0; j < N; j++)  // 打印测试
    //		{
    //			cout << dnums[j] << ", ";
    //		}
    //		cout << "lenth:" << lenth ;
    //		cout << " flag:" << flag << endl;
        }
        return lenth;
    }
    // 选择排序(升序)
    void selection_sort(int *dnums, int len)
    {
        int lenth = len;  // 待排序的长度
        for(int i=len-1; i >= 0; i--)
        {
            int flag = 0;   // 起始标志位
            for(int j=1; j <= i; j++)
            {
                if (dnums[flag] < dnums[j]) // 寻找最大值
                {
                    flag = j;   //  记录最大值位置
                }
                if(j == lenth || lenth == 1)
                {
                    break;
                }
            }
            int temp = dnums[lenth-1];  // 临时存储 (未排序)末尾的值
            dnums[lenth-1] = dnums[flag]; // 最大值移动到 (未排序)末尾
            dnums[flag] = temp;     //  补(原最大值的) 位
            lenth--;          // (未排序)长度减1
        }
    }
    

    优秀解析

    1. 计数排序思想(c++)

    #include <iostream>
    using namespace std;
    
    int main() {
        int N, n;
        while (cin >> N) {
            int a[1001] = { 0 };
            while (N--) {
                cin >> n;
                a[n] = 1;
            }
            for (int i = 0; i < 1001; i++)
                if (a[i])
                    cout << i << endl;
        }
        return 0;
    }
    

    2. set、 sorted(python)

    # python三行代码解法
    while True:
        try:
            a,res=int(input()),set()
            for i in range(a):res.add(int(input()))
            for i in sorted(res):print(i)
        except:
            break
    

    3. TreeSet (java)

    import java.util.Scanner;
    import java.util.TreeSet;
     
    public class Main
    {
        public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            while(sc.hasNext()){
                 
                TreeSet<Integer> set=new TreeSet<Integer>();
                int n=sc.nextInt();
                if(n>0){
                    for(int i=0;i<n;i++){
                        set.add(sc.nextInt());
                    }
                }
                for(Integer i:set){
                    System.out.println(i);
                }
            }
        }
    }
    

    4. set容器 (c++)

    #include<iostream>
    #include<set>
      
    using namespace std;
      
    int main(){
        int loop = 0;
        while (cin >> loop)                   //看题目,set容器
        {
            int a[1000], tem, i = 0;
            for (int i = 0; i < loop; i++) cin >> a[i];
            set<int> num(a, a + loop);
            for (set<int>::iterator it = num.begin(); it != num.end(); it++){
                cout << *it << endl;
            }
        }
        return 0;
    }
    
  • 相关阅读:
    行编辑
    二叉树
    多项式乘法
    引用标准库查看当前目录
    双向链表
    哈希表查找
    perl模块
    顺序栈实现
    C#中访问注册表
    查看perl的版本、配置和库信息
  • 原文地址:https://www.cnblogs.com/oucbl/p/12405928.html
Copyright © 2011-2022 走看看