剑指offer面试题3:数组中重复的数字

题目一:找出数组中重复的数字
在一个长度为n的数组里的所有数字都在0~n-1范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数组重复了几次。请找出数组中任意一个重复的数字。

例如:
{2,3,1,0,2,5,3}
output: 2 or 3

思路:扫描到下标为i的数字是,判断是否与num[i]的值相等,相等则继续扫描,否则与num[num[i]] 交换位置,继续判断值是否和i的位置相等,若不等,继续上面的步骤:
{1,3,2,0,2,5,3}
{3,1,2,0,2,5,3}
{0,1,2,3,2,5,3}
此时判断到num[4] 时 与 num[num[4]] 的值相等,则为重复数字。

void swap(int *num1, int *num2) {
	int tmp = *num1;
	*num1 = *num2;
	*num2 = tmp;
}

void duplicate(int nums[], int length) {
	int i = 0;
	for (i = 0; i < length; i++) {
		if (nums[i] != i) {
			while (nums[i] != nums[nums[i]]) {
				swap(&nums[i], &nums[nums[i]]);  // 不相等交换两数
			}
			if (nums[i] == nums[nums[i]] && nums[i] != i) {  // 重复条件
				printf("repeat num: [%d]\n", nums[i]);
			}
		}
	}
}

int main() {
	int nums[7] = { 2,3,1,0,2,5,3 };
	int length = 7;

	duplicate(nums, length);
	//stop;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34595352/article/details/87920281