C++数组去重与排序

一、整型数组去重与排序:

【题目描述】

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

【输入】

有2行。第1行为1个正整数N ,表示所生成的随机数的个数。第2行有N个用空格隔开的正整数,为所产生的随机数。

【输出】

共2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

例如:

输入结果
10
20 40 32 67 40 20 89 300 400 15
8
15 20 32 40 67 89 300 400

这个题可以采用先去重再排序的思路,代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
#include<cmath>
#include<iomanip>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<stdio.h>
#include<cstdio>
#include<cstring>
#include<map>
#define M 100
using namespace std;
long long  a[M + 5],/*f[M+5]*/b[M+5];
//char a[1000001], b[1000001], c[1000001];
int main()
{
	int n,i,j,cnt=0;
	cin >> n;
	for (i = 1; i <= n; i++)
	{
	cin>> a[i];
	}
	b[++cnt] = a[1];
	for (i = 2; i <= n; i++)
	{
		for (j = 1; j <= cnt; j++)
		{
			if (a[i] == b[j])
			{
				break;
			}
		}
		if (j > cnt)
		{
			b[++cnt] = a[i];
		}
	}
	sort(b + 1, b + cnt + 1);
	cout << cnt << endl;
	for (i = 1; i <cnt; i++)
	{
		cout << b[i] << " ";
	}
	cout << b[i] << endl;




	
    return 0;
}

或者也可以用集合法:

#include <bits/stdc++.h>
#define M 100
using namespace std;
int a[M+5]={1},b[M+5]={0},c[M+5]={0};
int main()
{
    int n,i,x;
    set<int>s;
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>x;
        s.insert(x);//向集合s中插入x;

    }
    cout<<s.size()<<endl;
for(auto e:s)
{
    cout<<e<<" ";
}
cout<<endl;
    return 0;
}

二、字符串去重(按原来顺序):

【题目描述】

输入一个长度不超过 100 的字符串,删除串中的重复字符。例如:输入的字符串为abacaeedabcdcd,

删除重复字符串后为abced。

【输入格式】

一个长度不超过100个字符。

【输出格式】

删除重复字符后的字符串,保留原来的顺序。

例如:

输入结果
abacaeedabcd
abced

若去重加排序,则直接集合法:

#include <bitsdc++.h>
#define M 100
using namespace std;
int a[M+5]={1},b[M+5]={0},c[M+5]={0};
int main()
{
    char s[M+5];
    cin>>s;
    int len =strlen(s);
    int i;
    set<char>z;
    for(i=0;i<len;i++)
    {
        z.insert(s[i]);
    }
    for(auto e:z)
    {
        cout<<e;
    }



    return 0;
}

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值