剑指offer
#3数组中重复出现的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
int findRepeatNumber(int* nums, int numsSize)
{
// 1、找出数组中最大的一个元素
int max = nums[0];
for(int i=0;i<numsSize;i++)
{
if(max<nums[i])
max=nums[i];
}
// 2、创建一个临时数组
int *countArray=(int*)malloc((max+1)*sizeof(int));
for(int i=0;i<=max;i++)
countArray[i]=0;
// 3、将nums中的出现次数添加到countArray中
for(int i=0;i<numsSize;i++)
{
countArray[nums[i]]++;
}
// 4、将出现次数>=2次的数字打印出来;
int ret=0;
for(int i=0;i<=max;i++)
{
if(countArray[i]>=2)
{
ret=i;
break;
}
}
return ret;
}
/*
这道题的关键在于通过这两个测试用例,因为用数组计数的方式,下标0 的意义就显得格外重要了
[2, 3, 1, 0, 2, 5, 3] //如果使用-1 这里的边界值0 就会出现-1
[1, 1, 1] //只出现一个计数空间
int *countArray=(int*)malloc((max+1)*sizeof(int));
为了便于人类的习惯理解,这里采用牺牲一个空间的做法max+1
这样计数就可以在它的位置计数了,不需要为了节省一个空间 -1(还因为0-1的话0会出现-1)
比如:
0 1 2 3 4 5
1 1 2 2 0 1
*/