对整数序列进行去重操作

这是一种很常见的题目,下面会给出两种解法和思路

题目描述


给定含有 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;
}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值