微软的一个面试题

★假设你有一个用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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值