题目描述
给定含有 个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的数,只保留该数第一次出现的位置,删除其余位置。
题目链接:B2098 整数去重 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
输入格式
输入包含两行:
第一行包含一个正整数 (1 ≤
≤ 20000),表示第二行序列中数字的个数;
第二行包含 个整数,整数之间以一个空格分开。每个整数大于等于 10 、小于等于 100。
输出格式
输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。
解题思路
我们首先定义一个数组num用来判断下标为i的数出现的次数,初始化为0。然后循环输入n个数据,每次输入数据,相应的下标位置计数就加1,如果刚好计数为1,那么输出该数,否则跳过不输出。
解题代码
C代码
#include<stdio.h>
#include<string.h>
int main(){
int n;
scanf("%d",&n);
int a[n];
int flag[101];//flag数组记录出现次数
memset(flag,0,sizeof(flag));
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
flag[a[i]]++;
if(flag[a[i]] == 1)
printf("%d ",a[i]);
}
return 0;
}
C++代码
#include<iostream>
using namespace std;
const int N = 2010;
int a[N],n,len; //len 记录输出长度
bool h[N]; //标记每一个数出现了多少次
int main()
{
cin>>n;
for(int i=0;i<n;i++){
int t;
cin>>t;
//如果这个数之前没有出现过则加入a数组,并标记这个数为true
if(h[t] == false) a[len ++] = t,h[t] = true;
}
for(int i=0;i<len;i++) cout<<a[i]<<' ';
return 0;
}
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数据
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] num = new int[105];//定义一个数组用来计算下标i出现的次数
//由于输入的数均大于等于10,小于等于100,因此我们的数组大小为105
//将数组初始化为0
for (int i = 0; i <= 100; i++){
num[i] = 0;
}
for (int i = 1; i <= n; i++){
int temp = scanner.nextInt();//输入每个数据
if(num[temp] == 0){
//如果这个数没有出现过
//那么输出这个数
System.out.print(temp + " ");
num[temp]++;//计数变为加1
}
//如果num[temp] != 0就不用管,直接跳过
}
}
}