牛客网刷题(三)找出数组中重复的数字

本文介绍了一种在数组中查找重复数字的算法,利用数组下标与值的关系,通过比较和交换实现快速定位重复数字,提供了详细的算法思路及C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

 

思路:要找到第一个重复的数字,我们可以借鉴哈希的思路,将数组中的值存储到与之下标相同的数组中,比如说a[1]=2,则将a[1]存储到a[2]中,如果下一次出现a[7]=2,则也想将a[7]存储到a[2]中,这时发现a[2]中存储的值与a[7]相同,即找到重复的值。

1.首先要比较a[i]的值是否等于i,如果等于则对a[i]不作操作,直接i++。

2.如果a[i]的值不等于i,那么首先查看a[i]的值是多少,假设是m,那么比较a[i]和a[m]的值是否相等,如果不相等,那么则将a[i]与a[m]的值交换,如果相等,那么,a[i]即为重复的数字。

画图解释一下,以数组{2, 3, 4, 1, 6, 8, 9, 0, 7, 1}为例

我们首先从i=0的位置开始,a[0]=2,0不等于2,这是我们再将a[0]的值与a[2]的值进行比较,发现不相等,则将二者的值交换,数组变成

重复上述过程,继续比较和交换 

此时,应该是找到重复数字的最后一个步骤,我们再往下比较时会发现,a[0]=1=a[1],这是说明我们找到了重复元素

 将a[0]=2与下标是2的数字比较一下,发现a[0]=a[2]是相同的。

插入代码:

#include<iostream>
#include<vector>
using namespace std;
int fun2(int *arr, int len)
{
	int i = 0;
	while (i<10)
	{
		if (arr[i] != i)
		{
			int dfg = 0;
			int tmp = arr[i];
			if (arr[tmp] == tmp)
			{
				cout << tmp << endl;
				return tmp;
			}
			else
			{
				dfg = arr[tmp];
				arr[tmp] = arr[i];
				arr[i] = dfg;
			}
		}
		else
		{
			i++;
		}
	}
	cout << -1 << endl;
	return -1;
	
}
int main()
{
    int ch[10] = { 2, 3, 4, 1, 6, 8, 9, 0, 7, 1 };
	fun2(ch, 10);
    return 0;
}

显示结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值