剑指offer1:找出数组中的重复数字

内容:

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

解题思路:

重排这个数组。从头到尾一次扫描这个数组中的每一个数字。当下标为i时,首先比较这个数字(m)是不是等于i。如果是接着扫描下一个。如果不是,再拿这个数字和下标为m的数进行比较。如果它和第m个数相等,则找到重复值,如果不相等就把它和第m个数交换。把m放到属于它的位置上去。依次重复上述过程。

 如:{2,3,1,0,2,5,3}从0开始计数,数组第一个下标位置为0,里面的值为2,不相等交换下标为2的地方变为:{1,3,2,0,2,5,3},然后在比较下标为0的位置,值为1,不相等,交换下标为0和下标为1的值{3,1,2,0,2,5,3};比较下标和内容不相等,继续交换下标为0的值和下标为3的值{0,1,2,3,2,5},依次继续交换。

代码实现:

int is_find(int a[], int len)
{
	assert(a);
	int ret = 0;
	int i=0;
	while ((a[i]>=0)&&(i < len)){
		while (a[i] != i)
		{
			if (a[i] == a[a[i]])
			{
				ret = a[i];
				return ret;
			}
			else
			{
				a[i] ^= a[a[i]];
				a[a[i]]^= a[i];
				a[i] ^= a[a[i]];
			}
		}
		i++;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41889292/article/details/80470860
今日推荐