快速找出故障机器(single number)

简单起见,假设每个机器存储一个标号为ID的记录(ID是小于十亿的整数),假设每份数据都保存两个备份,这样就有两个机器储存了同样的数据。

1.在某个时间,如果得到一个数据文件ID的列表,是否能够快速地找出这个表中仅出现一次的ID?

2.如果已经知道只有一台机器死机(也就是说只有一个备份丢失)呢?如果有两台机器死机呢(假设同一个数据的两个备份不会同时丢失)?

对应的是leetcode的Single Number,找出唯一一个出现一次的数字(其他数出现两次)

思想:异或思想,异或之后得到的结果就是单独一个的那个数字!

拓展:有两个数字只出现一次,其他数字出现两次,找出这两个数字?

思想:异或所有数字,得到的结果是只出现一次的那两个数异或的结果。。利用此结果分段:

a^b的结果是:可以通过第一个位是1,来进行分段(由于a,b不同,所以异或的结果,必然至少出现有一位是1)

通过此位进行分段:得到两类,然后进行异或,得到的两个数就是single number 

编程之美(p39),剑指offer(40题)

拓展:single numberII

思想:利用位运算,此bit的1相加mod3,得到结果就是single number

class Solution {
public:
int singleNumber(int A[], int n) {
int bitnum[32]={0};
int res=0;
for(int i=0; i<32; i++){
for(int j=0; j<n; j++){
bitnum[i]+=(A[j]>>i)&1;
}
res|=(bitnum[i]%3)<<i;
}
return res;
}
};

原文地址:https://www.cnblogs.com/kkshaq/p/4421956.html