很久没有写关于算法题的了。
这里写一下一个非常简单但又很经典的算法题。
主要过程是利用bit和数位运算去求数列中的唯一的数。
题目一:
一个数列中,有一个数只出现了一次,其它数全都出现了两次,求这个数。要求一次遍历,常量extra空间。
题目二:
一个数列中,有一个数出现了一次或两次,其它数全都出现了三次,求这个数。要求一次遍历,常量extra空间。
题目一比较简单,如果一个bit出现两次就归0,就直接贴一下代码:
public class Solution {
public int singleNumber(int[] A) {
int res=0;
for(int a:A){
res=res^a;
}
return res;
}
}
主要说下题目二,用one来记录只出现过一次的bits,用two来记录只出现过两次的bits,出现三次就归0。代码实现如下:
public class Solution {
public int singleNumber(int[] A) {
int one=0,two=0;
for(int a:A){
int three=two&a;
two=(two&~a)|(one&a);
one=one^a&(~three);
}
return one|two;
}
}
上面代码中有两个需要注意的点:
- three完全不依赖前一个three,只依赖于前一个two,所以可以把three先确定下来;
- 实际上只是维护了one和two,three等同于zero,只是用作辅助,用于把one中的three的部分归零。