首页 > 试题广场 >

明明的随机数

[编程题]明明的随机数
  • 热度指数:1635658 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于明明生成的 n1500 之间的随机整数,你需要帮助他完成以下任务:
\hspace{23pt}\bullet\,删去重复的数字,即相同的数字只保留一个,把其余相同的数去掉;
\hspace{23pt}\bullet\,然后再把这些数从小到大排序,按照排好的顺序输出。
\hspace{15pt}你只需要输出最终的排序结果。

输入描述:
\hspace{15pt}第一行输入一个整数 n\ (1 \leqq n \leqq 1000),代表明明生成的数字个数。
\hspace{15pt}此后 n 行,第 i 行输入一个整数 a_i\ (1 \leqq a_i \leqq 500),代表明明生成的随机整数。


输出描述:
\hspace{15pt}输出若干行,每行输出一个整数,代表输入数据排序后的结果。第一行输出最小的数字。
示例1

输入

3
2
2
1

输出

1
2




#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; }


编辑于 2019-03-20 14:21:35 回复(353)

提供一个边输入边申请空间排序的解法

#include <stdio.h>

int cmp(int *a, int *b){
    return *a-*b;
}

int main(){
    int N = 0;
    //输入为空时结束
    while(~scanf("%d\n",&N)){
        int num = 0;
        //留出一个位置用于设置结束条件
        int *p = (int *)malloc(sizeof(int)*(N+1));
        //清空内存
        memset(p,0,sizeof(int)*(N+1));
        for(int i=0; i<N; i++){
            scanf("%d\n",&p[i]);
        }
        //快排函数运用,只排序前N个
        qsort(p,N,sizeof(int),cmp);
        int *t = p;
        //不清空内存就要在这设置 t[N] = '\0';
        //用while的坏处就是结尾后面如果连接别的数据就会继续循环
        while(*t != '\0'){
//             if(*t == num){
//                 *t++;
//                 continue;
//             }
//             else{
//                 num = *t++;
//                 printf("%d\n",num);                
//             }
            if(*t != *(t-1))
                printf("%d\n",*t);
            *t++;
        }
        free(p);
        t = NULL;
    }
    return 0;
}
发表于 2021-09-26 16:18:24 回复(0)

while(len = parseInt(readline(), 10)) {
    const buffer = Array(len).fill(0).map(() => parseInt(readline(), 10));
    console.log([...new Set(buffer.sort((a, b) => a - b))].join('\n'))
}

发表于 2021-03-28 22:33:55 回复(0)
#include<iostream>

using namespace std;

int main()
{
    int data[1001] = {0};
    int n;
    int d;
    int max_index;
    while(cin>>n)
    {
        max_index = 0;
        while(n--)         {             cin >> d;             data[d] = 1;             max_index = d > max_index ? d : max_index;         }                  for(int i=1;i <= max_index; i++)         {             if (data[i] == 1)             {                 cout << i << '\n';                 data[i] = 0;             }         }     } }


编辑于 2021-01-30 02:41:42 回复(0)
// 自测没问题,保存并提交就出问题了,牛客你为什么这么烂!!!!
const listNum = [];
var data = '';
var size = 0;
while(data = readline()){
  if (size === 0) {
    size = data
  } else {
    size--;
    listNum.push(data);
  }
}

const sortList = listNum.sort((a, b) => a - b);

console.log(sortList
  .filter((item, index) => item !== sortList[index + 1])
  .join('\n'))
// 自测没问题,保存并提交就出问题了,牛客你为什么这么烂!!!!

编辑于 2021-01-19 21:49:03 回复(0)
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    vector<int> vec;
    while(1)
    {
        int count;
        cin>>count;
        if(cin.eof())
            break;
        while(count--)
        {
            int number;
            cin>>number;
            vec.push_back(number);
        }
    }
    sort(vec.begin(),vec.end());
    auto end_unique=unique(vec.begin(),vec.end());
    vec.erase(end_unique,vec.end());
    for(auto iter:vec)
        cout<<iter<<endl;
    return 0;
}
发表于 2021-01-15 14:59:46 回复(1)
import sys
while True:
    line = sys.stdin.readline()
    if not line:
        break
    t = set()
    n  = input()
    for i in range(int(n)):
        t.add(int(input()))
        
    for i in sorted(t):
        print(i)
# 这种也可以,但是不支持 import sys 爆粗
发表于 2020-11-02 14:36:58 回复(0)
var arr=[];
var start=0;
var num=0;
while(line=parseInt(readline())){
    if(start==0){
        num=line;
    }
    else if(start<=num)
    {
        arr.push(line); 
    }
    else{
        start=0;
        num=line;
    }
    start++;
}

arr.sort((a,b)=>{return a-b});
for(var i=0;i<arr.length;i++){
    if(i==0) console.log(arr[0]);
    else if(arr[i]==arr[i-1]) continue;
    else console.log(arr[i]);
}
javascript v8 代码)题目有错误。输入跟实际输入不一致,导致我的代码一直运行不了。
编辑于 2020-08-28 21:59:00 回复(0)

#include<stdio.h>

int main()
{
	int a[1001] = {0};
	int i = 0;
	int j;
	while (scanf("%d", &j) != EOF)
	{
		a[j] = j;
	}
	for (i = 0; i<1001; i++)
	{
		if (a[i] != 0)
			printf("%d\n", a[i]);
	}
    return 0;
}
很神奇,明明本地以及自测都能通过,最后提交出现问题,求打什么看看为什么
发表于 2020-05-07 15:52:15 回复(0)
#include<iostream>
using namespace std;
short handle(short*arr,short start,short end){
  while(start<end){
    while(start<end&&arr[start]<=arr[end])--end;
    short tmp=arr[start];
    arr[start]=arr[end];
    arr[end]=tmp;
    while(start<end&&arr[start]<=arr[end])++start;
    tmp=arr[start];
    arr[start]=arr[end];
    arr[end]=tmp;    
  }
  return start;
}
void quick_sort(short *arr,short start,short end){
  if(start>=end)return;
  short tmp=handle(arr,start,end);
  quick_sort(arr,start,tmp-1);
  quick_sort(arr,tmp+1,end);
}
int main(){
  short n;
  while(cin>>n){
    short end=n-1,tmp;
    short arr[n];
    while(n>0&&cin>>tmp){
      arr[end+1-n]=tmp;
      --n;
    }
    quick_sort(arr,0,end);
    int i=0,j=1;
    cout<<arr[0]<<endl;
    for(;j<=end;++i,++j)
      if(arr[i]!=arr[j])cout<<arr[j]<<endl;
  }
}

发表于 2020-03-19 10:49:10 回复(0)
这个题目描述让我很不舒服。
在“注”前面的input param和return value,让我读到这里的时候以为n和inputArray这两个东西是预输入的,类似C#里面Main(string[] args)这个args,然后那return value让我以为最后要return一个东西。但实际上都没有,所有东西都和前两题没什么差别,所有东西都是在main运行时再通过键盘输入。这五行字完全可以去掉,只需要看“注”后面的就很好明白了。

--------------

然后是解题。这个题目其实最大的难点还是“同一个测试用例里可能会有多组数据”。
例如两组数据,第一组为{10,20,30},第二组为{60,50,40,70}。
那么输入就会是:
3
10
20
30
4
60
50
40
70
这里可能就会出现一个误区:“我们需要把这一堆一共9个数字全输入进去后输出结果”,但其实不是,我们完全可以在每输入完一组数据之后立刻输出结果,再输入下一组数据。这个考试验证结果,是将你所有的输出结果连在一起,与答案进行对比的。

第二个问题就是,我们不知道会输入多少组数据,如果输入示例是每行一组数据那就很明了了。但它是每行一个数据。于是我们就要用一个循环语句来输入数据,但循环什么时候停下来呢?从题目的输入示例里面我们无法直观地看出来(如果写题目的时候输入示例那里多空出一行,或者最后一行是个非数字、非正数等就明确多了),我们只能猜测,一般都是输入为空的时候结束。
发表于 2020-03-09 01:15:03 回复(0)
//再次感受到sort函数的厉害之处
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int* a=new int[n];
        for(int i=0;i<n;i++)
            cin>>a[i];
        sort(a,a+n);
        cout<<a[0]<<endl;
        for(int i=1;i<n;i++)
            if(a[i]!=a[i-1])
                cout<<a[i]<<endl;
    }
    return 0;
}

发表于 2020-01-07 09:25:11 回复(0)
唯一注意的是这个需要考虑连续输入的,感觉OJ一定要考虑好输入输出的格式才行。
#include <iostream>
#include <vector>
#include <algorithm> 

using namespace std;

int main() {
    int N;
    while (cin >> N) {
        vector<int> array;
        int num;
        for (int i = 0; i < N; ++i) {
            cin >> num;
            array.push_back(num);
        }
        sort(array.begin(), array.end());
        vector<int>::iterator duplicated = unique(array.begin(), array.end());
        array.erase(duplicated, array.end());
        for (auto it : array) {
            cout << it << endl;
        }
    }
    return 0;
}


发表于 2019-08-16 20:06:26 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int n,a;//输入个数
    int signal=0;
    int input[1000];//输入的数组
    while(cin>>n)
    {
        //输入
        for(int i=0;i<n;i++)
        {
            cin>>a;
            input[i]=a;
        }
        //排序
        for(int i=0;i<n-1;i++)
            for(int j=0;j<n-i-1;j++)
            {
                if(input[j]>=input[j+1])
                {
                    int temp=input[j];
                    input[j]=input[j+1];
                    input[j+1]=temp;
                }
            }
        //将其打印(重复部分用判断语句删除重复的部分)
        for(int i=0;i<n;i++)
        {
            if(input[i]!=input[i+1])
                cout<<input[i]<<endl;
        }
    }
    return 0;
}
发表于 2019-07-01 17:38:24 回复(0)
#include <iostream>
#include <set>
using namespace std;

int main() {     int N,num;     set<int> myset;     while (cin >> N) {         for (int i = 0;i < N;i++) {             cin >> num;             myset.insert(num);         }         for (auto it = myset.begin();it != myset.end();++it) {             cout << (*it) << endl;         }         myset.clear();     }     return 0;
}


发表于 2019-04-11 22:00:26 回复(0)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
    int num;
    while (cin >> num)
    {
        vector<int> arr;
        while (num--)
        {
            int temp;
            cin >> temp;
            arr.push_back(temp);
        }
        sort(arr.begin(), arr.end());//排序
        arr.erase(unique(arr.begin(), arr.end()), arr.end());//删除重复元素
        for (int i : arr)
        {
            cout << i << endl;
        }
    }
    return 0;
用到了<algorithm>里的sort和unique,即先排序,再用erase+unique删除相邻的重复元素,最后输出。最坑的是输入格式,卡了好久...
编辑于 2019-04-02 23:46:16 回复(0)
练习一下vector的unique和erase函数
#include <bits/stdc++.h>
using namespace std;
int main(int argc,char** argv)
{
    int n;
    
    while(cin>>n){
    vector<int> vec;
    vec.resize(n);
    for(int i=0;i<n;++i)
    {
        cin>>vec[i];
    }
    sort(vec.begin(),vec.end());
    auto iter=unique(vec.begin(),vec.end());
    vec.erase(iter,vec.end());
    for(auto i:vec)
        cout<<i<<'\n';
    }
    return 0;  
}
发表于 2019-03-14 15:23:34 回复(0)
来分享个c++的STL打法
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,num[1001];
int main()
{
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)scanf("%d",&num[i]);
        sort(num+1,num+1+n);
        unique(num+1,num+1+n);
        for(int i=1;i<=n;i++)
        {
            if(num[i]<=num[i-1])break;
            printf("%d\n",num[i]);
        }
    }
    return 0;
    
}

编辑于 2018-09-29 19:49:24 回复(0)
#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        int j = 0, k = 0;
        int *ran = new int[n];
        for (int i = 0; i < n; i++) cin >> ran[i];
        sort(ran, ran + n);
        while (++j < n)
        {
            if (ran[k] != ran[j]) ran[++k] = ran[j];
        }
        for (j = 0; j <= k; j++) cout << ran[j] << endl;
    }
    return 0;
}
发表于 2018-05-09 16:01:03 回复(0)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <set>
using namespace std;
void Random()
{
    set<int> s;
    int p;
    int n;
    while(cin>>n)
    {
        while(n--)
        {
            cin>>p;
            s.insert(p);
        }
        for(set<int>::iterator it = s.begin();it!=s.end();it++)
        {
            cout<<*it<<endl;
        }
        s.clear();
    }
}
int main()
{
    Random();
    return 0;
}

发表于 2018-05-07 15:22:13 回复(0)

问题信息

难度:
2843条回答 290891浏览

热门推荐

通过挑战的用户

查看代码
明明的随机数