[编程题] 明明的随机数

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;
}
posted @ 2020-03-04 00:39  oucbl  阅读(948)  评论(0编辑  收藏  举报