《剑指offer》数组中重复数字

问题描述

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

题目解析

设遍历到的数下标为i,数值为m
分为三步
(1)m与第i个数比较,相同则惊醒下一次循环,若不同则进入(2)
(2)m和第m个数比较,相同则是重复的,不同进入(3)
(3)将m与第m个数交换,进入(1)

题目代码

#include
using namespace std;

int duplicate(int numbers[], int length)
{
	if (numbers == nullptr || length < 0)  //判断是否传入空指针或数组长度小于0
	{
		return -1;
	}
	for (int i = 0; i < length; i++)
	{
		if (numbers[i] < 0 || numbers[i] >= length) //判断是否越界
		{
			return -1;
		}
	}
	for (int i = 0; i < length; i++)
	{
	L1:	if (numbers[i] != i)
		{
			if (numbers[i] == numbers[numbers[i]])
			{
				return numbers[i];
			}
			else
			{
				int temp;
				temp = numbers[i];          
				numbers[i]=numbers[temp];
				numbers[temp] = temp; //特别注意此处不可以写成numbers[numbers[i]] = temp;
				goto L1;
			}
		}	
	}
	return 0;
}

int main()
{
	int num[] = { 1,2,2,3,6,4,3 };
	cout << duplicate(num, 7);
	return 0;
}

思考

这里是任意一个重复,如要求出所有重复,则需要遍历数组或用哈希表解决问题

你可能感兴趣的:(剑指offer)