这是一种很常见的题目,下面会给出两种解法和思路
题目描述
给定含有 n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复
出现的数,只保留该数第一次出现的位置,删除其余位置。
输入格式
输入包含两行:
第一行包含一个正整数 n(1 ≤ n ≤ 20000),表示第二行序列中数字的个数;
第二行包含 n 个整数,整数之间以一个空格分开。每个整数大于等于 10 、小于等于 100。
输出格式
输出只有一行,按照输入的顺序输出其中不重复的数字,整数之间用一个空格分开。
解法一
原理是将a[i]与数组前面的数进行比较,如果两数相等则使i-1,n-1,这样输入的下一个数会将重复的那个数覆盖,这样就得到了一组去重的数。
#include <stdio.h>
int main()
{
int arr[20001];
int n, i, j;
//一共有n个数,其中有重复的,要把重复的数字去掉,其余打印
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
for (j = 0; j < i; j++)
{
//遇到重复的数字时
if (arr[j] == arr[i])
{
i--; //每次循环结束i++,这里i--是为了让下一次循环再次从这里开始
//重复的数字所在的a[i]就会被重新赋值
n--; //每遇到重复的数字,最后需要的数字总数-1
}
}
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
解法二
将输入的数字(num) 作为一个初始化后的数组的下标,若a[num] == 0,输出num并给a[num]赋值1,循环结束后便得到一组去重后的数列。
#include <stdio.h>
int main()
{
int n, i, num;
int arr[20001] = { 0 };
//先进行初始化,全部为0
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &num);
//判断整数是否第一次出现,arr[num] == 1就是出现过了
if (arr[num] == 0)
{
printf("%d ", num);
arr[num] = 1; //打印后num后,给arr[num]赋值1
}
}
return 0;
}