题目:
假设你有一个用1001个整数组成的数组,这些整数是任意排列的,
但是你知道所有的整数都在1到1000(包括1000)之间。
此外,除一个数字出现两次外,其他所有数字只出现一次。
假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。
如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?
思路:
使用了辅助的存储方式:
假设1001个数组组成的数组Array[1001];创建一个容量1000的数组Count[1000],数组清零。
遍历一遍Array,将Array[i]的值当作Count下标序号,置Count[Array[i]-1]=1;
即当Array[i]=20时,Count[19]=1;
每遍历一个Array的数值,先检查对应的Count值是否为1?
若为1则表示该数值就是重复出现的数字;若为0则表示该数值还没出现过,将其置1。
不使用了辅助的存储方式:
将1001个数组组成的数组求和得Sum1。将1到1000求和得Sum2。
Sum1与Sum2之差就是出现两次的数字。
代码:
使用了辅助的存储方式:
int FindRepeatNumber(int Array[])
{
int Count[1000] = {0};
for(int i = 0; i < 1001; i++)
{
if(Count[Array[i]-1] == 1)
{
return Array[i];
}else
{
Count[Array[i]-1] = 1;
}
}
}
不使用了辅助的存储方式:
int FindRepeatNumber(int Array[])
{
int Sum1 = Array[0];
int Sum2 = 0;
for(int i = 1; i < 1001; i++)
{
Sum1 += Array[i];
Sum2 += i;
}
return Sum1-Sum2;
}