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
个人方法
思路:
- 无序去重:
- python: 元素可直接删除,故数组长度不断减少。
- c++: 数组长度不变,去重后的长度用逻辑长度代替,即重复元素与(逻辑)序列末尾元素交换,并补0。
- 选择排序(升序)
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;
}