首页 > 试题广场 >

小乐乐与序列

[编程题]小乐乐与序列
  • 热度指数:19715 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

老师给了小乐乐一个正整数序列,要求小乐乐把这个序列去重后按从小到大排序。但是老师给出的序列太长了,小乐乐没办法耐心的去重并排序,请你帮助他。


输入描述:

第一行包含一个正整数n,表示老师给出的序列有n个数。接下来有n行,每行一个正整数k,为序列中每一个元素的值。(1 ≤ n ≤ 105,1 ≤ k ≤ n)



输出描述:
输出一行,为去重排序后的序列,每个数后面有一个空格。
示例1

输入

4
2
2
1
1

输出

1 2 
示例2

输入

5
5
4
3
2
1

输出

1 2 3 4 5 
n = int(input())
l=[int(input()) for i in range(0,n)]
l1 = list(set(l))
print(*sorted(l1))

发表于 2021-07-01 01:22:43 回复(0)
这个题最简单的方式就是用STL里面的set集合容器,插入元素后自动帮你从小到大排序,如果有重复的元素,反而无法插入到容器里
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >> n;
    set<int> s;
    for(int i = 0; i < n; i++){
        int num;
        cin >> num;
        s.insert(num);
    }
    for(auto i : s)
        cout << i << " ";
    cout << endl;
    return 0;
}

发表于 2020-06-03 16:07:46 回复(0)
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
public class Main{

	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		int n=input.nextInt();

		HashSet<Integer> set=new HashSet<Integer>();

		for(int i=0;i<n;i++)
		{
			set.add(input.nextInt());
		}
	
		List<Integer> list=new ArrayList<Integer>(set);
		Collections.sort(list);
		for(Integer l:list)
			System.out.print(l+" ");
		}
	}


定义一个集合,输入元素后,集合过滤去重,将过滤后的元素放到list中,再利用
Collections.sort(list);

输出。一个小的注意事项:HashSet的迭代器在输出时“不保证有序”,但也不是“保证无序”。也就是说,输出时有序也是允许的,但不保证实现的时候每次输出都是有序。

发表于 2021-01-27 14:22:27 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int* a=new int[n];
    for(int i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n);
    int m=unique(a,a+n)-a;
    for (int i = 0; i <m; i++)
		cout << a[i] << " ";
    delete []a;
    return 0;
}

发表于 2020-07-10 20:03:20 回复(0)

                      JavaScript

while(line = readline()){
    var n =  parseInt(line);
    var res =[];
    for(var i=0;i<n;i++){
        var nline = parseInt(readline());
        res.push(nline);
    }
    res = [...new Set(res)].sort(function(a,b){
        return a-b
    })
    console.log(res.join(" "));
}


发表于 2020-06-23 09:05:27 回复(0)
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n,k=0;
    cin>>n;
    int a[n],b[n];//修改为静态数组a[10001]出错,不清楚是怎么回事,哈哈
    for(int i=0;i<n;++i)
    {
        cin>>a[i];
        b[i]=0;
    }
    for(int i=0;i<n;++i)
    {
        if(b[a[i]]==0)
        {
            a[k++]=a[i];
            b[a[i]]=1;
        }
    }
    sort(a,a+k);
    for(int i=0;i<k;++i)
        cout<<a[i]<<" ";
    return 0;
}

编辑于 2020-03-28 13:08:00 回复(0)
// Compiled in C++14(g++5.4)

#include <bits/stdc++.h>

using namespace std;

namespace IO {
    template <typename T>
    inline
    void read(T& t) {
        int n = 0; int c = getchar_unlocked(); t = 0;
        while (!isdigit(c)) n |= c == '-', c = getchar_unlocked();
        while (isdigit(c)) t = t * 10 + c - 48, c = getchar_unlocked();
        if (n) t = -t;
    }
    template <typename T, typename... Args>
    inline
    void read(T& t, Args&... args) {
        read(t); read(args...);
    }
    template <typename T>
    inline void write(T x) {
        if (x < 0) x = -x, putchar_unlocked('-');
        if (x > 9) write(x / 10);
        putchar_unlocked(x % 10 + 48);
    }
    template <typename T>
    inline void writeln(T x) {
        write(x);
        putchar_unlocked('\n');
    }
}

int main() {

    int n;
    IO::read(n);
    vector<int> A(n);
    for (auto &i : A) {
        IO::read(i);
    }
    sort(A.begin(), A.end());
    auto uniq = unique(A.begin(), A.end());
    for (auto it = A.begin(); it != uniq; ++it) {
        IO::write(*it);
        putchar_unlocked(' ');
    }
    putchar_unlocked('\n');
    return 0;
}
// Compiled in C++14(g++5.4)
 
#include <bits/stdc++.h>
 
using namespace std;
constexpr int MAXN = 100005;
 
namespace IO {
    template <typename T>
    inline
    void read(T& t) {
        int n = 0; int c = getchar_unlocked(); t = 0;
        while (!isdigit(c)) n |= c == '-', c = getchar_unlocked();
        while (isdigit(c)) t = t * 10 + c - 48, c = getchar_unlocked();
        if (n) t = -t;
    }
    template <typename T, typename... Args>
    inline
    void read(T& t, Args&... args) {
        read(t); read(args...);
    }
    template <typename T>
    inline void write(T x) {
        if (x < 0) x = -x, putchar_unlocked('-');
        if (x > 9) write(x / 10);
        putchar_unlocked(x % 10 + 48);
    }
    template <typename T>
    inline void writeln(T x) {
        write(x);
        putchar_unlocked('\n');
    }
}
 
bitset<MAXN> A;
 
int main() {
 
    int n, val;
    int max_val = -1;
    int min_val = MAXN;
    IO::read(n);
    for (int i = 0; i < n; ++i) {
        IO::read(val);
        A[val] = true;
        max_val = max(max_val, val);
        min_val = min(min_val, val);
    }
    for (int i = min_val; i <= max_val; ++i) {
        if (A[i]) {
            IO::write(i);
            putchar_unlocked(' ');
        }
    }
    putchar_unlocked('\n');
    return 0;
}

编辑于 2020-04-24 09:35:19 回复(0)
#include <stdio.h>
int main(){
    int n,i,input,max = 0;
    int a[100001]={0};
    scanf("%d",&n);

    for(int i = 0; i< n; i++){   
    	scanf("%d",&input);
    	a[input] = input;      // 把相同的数存进相同的数组元素中, 
    	if(input >= max){            // 这样该数组元素只会保留一个相同的数
                    max = input;
        }
    }
        
    for(i=1;i<=max;i++){
        if(a[i]){             //按序输出非零元素
        printf("%d ",a[i]);
        }        
    }
    return 0;
}
在网上参考的,这个解法很巧妙,没有用排序算法和去重,而是利用了数组自然增序的特点进行去重排序。
编辑于 2020-04-18 21:35:43 回复(4)
8/10用例不能通过,可以帮我看看哪里出了问题吗?
#include<stdio.h>
#include<malloc.h>
int cmp(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
int main()
{
    int n,i,j;
    scanf("%d",&n);
    int* arr = (int*)malloc(n * sizeof(int));
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    for(i=0;i<n;i++)
    {
       for(j=i+1;j<n;j++)
       {
           if(arr[j]==arr[i])//相同则置零
               arr[j]=0;
       }
    }
    qsort(arr,n,sizeof(int),cmp);//数据排序
   for(i=0;i<n;i++)
   {
      if(arr[i]!=0)
      {
          printf("%d ",arr[i]);
      }
   }
    return 0;
}


发表于 2021-08-23 11:17:07 回复(6)
#include <stdio.h>
int main()
{
    int n = 0;
    int arr[100000] = {0};
    int i = 0;
    int tmp = 0;
    scanf("%d", &n);
    for(i=0; i<n; i++)
   {
        scanf("%d", &tmp);
        arr[tmp] = tmp;
   }
    for(i=0;i<n;i++)
    {
        if(arr[i]!=0)
            printf("%d ",arr[i]);
    }
    return 0;
}

发表于 2022-01-03 16:45:41 回复(1)
小乐乐没有耐心我也没有耐心,请你们帮助我😁😁😁
发表于 2021-12-06 22:42:11 回复(1)
#include<stdio.h>
int main()
{
    int i, n, k;
    while (~scanf("%d", &n))
    {
        int arr[100001] = { 0 };
        int max = 0;

        //出现过的数字,该元素改为1,作为标记
        for (i = 0; i < n; i++)
        {
            scanf("%d", &k);
            arr[k] = 1;
            if (max < k)
                max = k;
        }

        //正序输出标记过的数
        for (i = 0; i <= max; i++)
        {
            if (arr[i])
                printf("%d ", i);
        }
        printf("\n");
    }
    return 0;
} 

发表于 2021-12-02 02:02:39 回复(0)
#include <stdio.h>

int main() {
    int n=0;
    int tmp=0;
    int arr[100001]={0};
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&tmp);
        arr[tmp]=tmp;
    }
    for(int i=0;i<100001;i++){
        if(arr[i]!=0){
            printf("%d ",arr[i]);
        }
    }
    return 0;
}

编辑于 2024-02-04 16:53:53 回复(1)
#include<stdio.h>
int main()
{
    int arr[100000]= {0};
    int n = 0;
    scanf("%d",&n);
    int i = 0;
    int k = 0; //每一行的正整数
    for(i = 0;i<n;i++)
    {
        scanf("%d",&k);
        arr[k] = k;
    }
    for(i = 0;i<n;i++) //打印
    {
        if(arr[i])//不为0的时候打印
            printf("%d ",arr[i]);
    }
    return 0;
}

发表于 2022-05-16 16:17:58 回复(0)
#include <stdio.h>
#include <malloc.h>
#include <assert.h>

void QuickSort(int* left, int* right)
{
    assert(left && right);

    //只剩1个元素,无需继续排序
    //开始回归
    if (left >= right)
    {
        return;
    }

    int* i = left;
    int* j = right;
    int pivot = *left;

    while (i < j)
    {
        //j在小于pivot的地方停下来
        while (*j >= pivot && j > i)
        {
            j--;
        }
        *i = *j;

        //i在大于pivot的地方停下来
        while (*i <= pivot && i < j)
        {
            i++;
        }
        *j = *i;
    }
    //将基准元素pivot放入它该在的位置
    *j = pivot;

    QuickSort(left, i - 1);//i是上一轮已经处理好的元素,所以 -1 处理左边的元素
    QuickSort(j + 1, right);//j是上一轮已经处理好的元素,所以 +1 处理右边的元素
}

int main()
{
    int n = 0;
    int i = 0;
    int* p = NULL;

    scanf("%d", &n);

    //开辟空间
    p = (int*)malloc(sizeof(int) * n);
    if (!p)
    {
        perror("malloc:p");
        return 1;
    }

    //录入数列
    for (i = 0; i < n; i++)
    {
        scanf("%d", p + i);
    }

    //进行排序
    QuickSort(p, p + n - 1);

    //进行去重输出
    printf("%d ", *p);
    for (i = 1; i < n; i++)
    {
        if (*(p + i) == *(p + i - 1))
        {
            continue;
        }
        printf("%d ", *(p + i));
    }

    //释放空间
    free(p);
    p = NULL;

    return 0;
}

编辑于 2024-03-20 18:58:19 回复(0)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0,ar[100]={0},re=0;
	for (i = 0; i < n; i++)
	{
		scanf("%d", &ar[i]);
	}
	int j = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			if (i > j && ar[i] == ar[j])
			{
				ar[i] = -1;
			}
		}
	}
	for (i = 0; i < n-1; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{
			if (ar[j - 1] > ar[j])
			{
				re = ar[j-1];
				ar[j - 1] = ar[j];
				ar[j] = re;
			}
		}
	}
	for (i = 0; i < n; i++)
	{
		if (ar[i] > 0)
		{
			printf("%d ", ar[i]);
		}
	}
return 0;
}

大家可以帮忙看看错在哪里了吗
发表于 2023-01-14 17:28:44 回复(0)
#include<stdio.h>
#include <stdlib.h>
int main()
{
    int n = 0;
    int k = 0;
    scanf("%d",&n);
    int* arr = (int*)malloc(sizeof(arr)*n);//给arr开辟空间
    for (int i = 0; i < n; i++)
    {
        scanf("%d",&arr[i]);
    }
    /*int arr1[100] = { 0 };*/
    int* arr1 = (int*)malloc(sizeof(arr)*n);//给arr1开辟空间
    if (arr1 == NULL)
    {
        perror("arr1:");
    }
    for (int i = 0; i < n; i++)
    {
        arr1[arr[i]]++;//记录每个数出现的次数
    }
    for (int i = 1; i <= n; i++)
    {
        if (arr1[i] != 0)
        {
            printf("%d ",i);
        }
    }
    free(arr1);//释放空间
    free(arr);
    arr1 = NULL;
    arr=NULL;


    return 0;
}
发表于 2022-10-26 14:47:32 回复(0)
#include<stdio.h>

int main()
{
    int n=0;
    scanf("%d",&n);//多少个数字
    int arr[1000001]={0};
    int i=0;
    int tmp=0;
    for(i=0;i<n;i++)
    {
        scanf("%d",&tmp);//具体数字
        arr[tmp]=tmp;
    }
    //打印
    for(i=0;i<n;i++)
    {
        if(arr[i]!=0) //因为题目说输入的每个数字k不等于0
        {
            printf("%d ",arr[i]);
        }
    }

    return 0;
}
发表于 2022-09-11 11:45:23 回复(0)
n=int(input())
number=[]
for i in range(0,n):
    num=int(input())
    if num not in number:
        number.append(num)
number.sort()
for i in range(0,len(number)):
    print(number[i],end=" ")

发表于 2022-02-15 21:09:46 回复(1)
#include<stdio.h>
#include<stdlib.h>
int my(const void*e1,const void*e2)
{
    return *(int*)e1-*(int*)e2;
}
int main()
{
    int i,j,n;
    int tep=0;
    while(scanf("%d",&n)!=EOF)
    {
        int arr[100001]={0};
        int max=0;
        for(i=0;i<n;i++)
        {
            scanf("%d",&arr[i]);
        }
        qsort(arr,n,4,my);
        for(i=0;i<n;i++)
        {
            if(arr[i]!=tep)
            {
                printf("%d ",arr[i]);
                tep=arr[i];
            }
        }
    }
    return 0;
}
发表于 2021-12-20 23:21:37 回复(0)