题目链接:https://leetcode.com/problems/single-number-ii/
Given a non-empty array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Example 1:
Input: [2,2,3,2] Output: 3
Example 2:
Input: [0,1,0,1,0,1,99] Output: 99
思路:
位运算。
一种具有普适性的这类题的解法:
基本思路是一个int数字有32位,对于二进制32位中的每一位计算“1”出现的次数只和,
如果能被三整除说明只出现一次的那个数的二进制在该位也为0.如果不能被整除说明只出现
一次的数的二进制数在该位是“1”,再采用左移的方式还原该位,最后使用或操作“|”将结果正确求出。
比如数组 2 3 2 2 4 4 4
竖着转换为二进制(我这里先用8位演示,32位同理):
2: 0 0 1 0
3: 0 0 1 1
2: 0 0 1 0
2: 0 0 1 0
4: 0 1 0 0
4: 0 1 0 0
4: 0 1 0 0
从右往左看竖着的每一位,当取出竖着的每一位的总和时,能被3整除的那位就置零,否则置一。
AC 1ms Java:
class Solution {
public int singleNumber(int[] nums) {
if(nums==null||nums.length==0)
return -1;
int ans=0;
for(int i=0;i<32;i++){
int bitSum=0;
for(int num:nums){
int bit=(num>>i)&1;//取出第i位的值。
bitSum=bitSum+bit;
}
if(bitSum%3!=0)
ans=ans|(1<<i);//将第i位置1
}
return ans;
}
}