您的位置:首页 > 职场人生

微软的一个面试题

2014-04-14 20:32 274 查看
★假设你有一个用1001 个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1 到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?

解法一:可以将数组里的每个数都相加,然后减去1-1000的和,得到的结果就是那个重复的数字

int i = 0;

int num = 0;

for (i=0; i<1001; i++)

{

num += a[i] - i;

}

最后num的值就是多那个值

解法二:

int search(int m[])

{

int w[1001];//定义一个长度为1001的辅助数组。

for(int i=0;i<=1001;i++)

w[i]=-1;//将辅助数组的每个元素赋初值为-1

for(int j=0;j<=1000;j++)

{

/*遍历那个由1001个1到1000之间的整数组成的数组m。

如果w数组中第m[j]个位置的值没有被改变即还是-1,就把整数m[j]填入到w中m[j]第位置。否则就返回那个出现两次的数字。*/

if(w[m[j]]==-1)

w[m[j]]=m[j];

else

return m[j];

}

return 0;//如果没有找到重复的数字 则返回0.

}

此解法与解法一算法方面相似。

解法三:use A XOR A XOR B = B,任何数与其本身异或值都为0。

int
findX(int a[]) {

int k = a[0];

for (int i=1; i<=1000;i++)

k ^= a[i]^i;
//这里就是对数组中的数和1-1000的每个数都进行一次异或操作,得到的结果即为那个重复的数

}

return k;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: