整数去重-题解

xie-blog / 2024-10-25 / 原文

整数去重-题解

题目描述

给定含有 n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。

输入格式

输入包含两行:

第一行包含一个正整数 n(1<=n<=20000),表示第二行序列中数字的个数;

第二行包含 n 个整数,整数之间以一个空格分开。每个整数大于等于 10 、小于等于 100。

输出格式

输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。

样例 #1

样例输入 #1

5
10 12 93 12 75

样例输出 #1

10 12 93 75

解题思路:

这是一道比较简单的语法题,我们可以这样思考:要去掉数组中的重复元素,我们是不是可以先把重复元素的位置记录下来,在遍历的时候跳过它们,然后把剩下的元素输出出来.

AC代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int a[N],q[N];
int n;
int main()
{
	
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	} 
	
	int count=0;  //记录q数组的大小 
	for(int i=1;i<=n;i++)
	{
		
	     for(int j=i+1;j<=n;j++){    //遍历i右边的所有数,找到与a[i]相等的数。 
	     	if(a[i]==a[j]){
	     		q[++count]=j;  //将重复数的下标记录到q数组 
	     		break;
			 }
		 }
	}
	
	    vector<int>v;  //开一个vector数组,存储非重复数 
	
		bool flag=0;  //记录是否为重复数的标志 
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=count;j++){
    		if(i==q[j]){   
    		     flag=1;  //若遍历到重复数,则让flag置1 
    		     break;   //跳过这个数 
			}
		  flag=0;  //flag重新初始化,否则flag的值会一直为1 
		   
		}
		
		if(!flag){   
			v.push_back(a[i]);     //若不是重复数,则将它加入到v数组 
		}
		
	}
	
	
     for(const auto&elem:v)
	 {
		 cout<<elem<<" ";
	}

	return 0;
}