快速找出故障机器(single number)
2015-04-13 13:30
274 查看
简单起见,假设每个机器存储一个标号为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;
}
};
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;
}
};
相关文章推荐
- 编程之美1:快速找出故障机器
- 编程之美_1.5_快速找出机器故障
- 快速找出故障机器
- 快速找出故障机器
- 读书笔记-编程之美-1.5快速找出故障机器
- 编程之美--游戏之乐--1.5快速找出故障机器
- 第一章 游戏之乐 快速找出机器故障
- 《编程之美》阅读心得之快速找出机器故障
- 快速找出故障机器
- 每日一题(19) - 快速找出机器故障
- 《编程之美》-- 快速找出故障机器
- 读书笔记之编程之美 - 1.5 快速找出故障机器
- 编程之美1.5——快速找出故障机器
- 编程之美_1.5_快速找出机器故障
- 第1章 游戏之乐——快速找出故障机器
- 编程之美——快速找出故障机器
- 《编程之美》读书随笔之五:快速找出故障机器
- 编程之美:第一章 1.5快速找出机器故障
- 编程之美学习之快速找出故障机器
- 编程之美 - 1.5 快速找出故障机器