Single Number1:
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
解题思路,参照网上大神–异或
由于数字在计算机是以二进制存储的,每位上都是0或1,如果我们把两个相同的数字异或,0与0异或是0,1与1异或也是0,那么我们会得到0。根据这个特点,我们把数组中所有的数字都异或起来,则每对相同的数字都会得0,然后最后剩下来的数字就是那个只有1次的数字。
public class l136_single_number {
public int singleNumber(int[] A) {
int res=0;
for(int num:A) res=res^num;
return res;
}
Single Number2:
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
思路:
除了一个单独的数字之外,数组中其他的数字都出现了三次,那么还是要利用位操作 Bit Operation 来解此题。我们可以建立一个32位的数字,来统计每一位上1出现的个数,我们知道如果某一位上为1的话,那么如果该整数出现了三次,对3去余为0,我们把每个数的对应位都加起来对3取余,最终剩下来的那个数就是单独的数字。
public int singleNumber2(int[] A) {
int res=0;
for(int i=0;i<32;i++){
int sum=0;
for(int j=0;j<A.length;j++){
sum+=(A[j]>>i)&1;//如果该位存在值则&1=1;sum+1;
}
//某个数字出现了三次,则每一位相加必定是3或者0
res|=(sum%3)<<i;
}
return res;
}