题目描述:在一个长度为n+1的数组里所有数字都在1~n的范围内,所以数组中至少有一个数是重复的。请找出数组中任意一个重复的数,但不能修改输入的数组。
分析:重复的数一定在某范围内,我们可以逐渐缩小范围,直到找到重复的数。
代码如下:
public sealed class ErfenAndFind
{
public static int one = -1;
public static void Find(int[] arr,int start,int end)
{
//递归出口
if(start>=end)
{
one = arr[start];
return;
}
int count = 0;
int len = (start + end) / 2;
for(int i=0;i<arr.Length;i++)
{
if (arr[i] <= len )
count++;
}
if(count>(len-start+1)) //这里需要注意
{
end = len;
Find(arr, start, end);
}
else
{
start = len+1;
Find(arr, start, end);
}
}
}
总结:主要考虑怎么写看起来思路清晰。