[leetcode] 137. Single Number II 解题报告

题目链接:https://leetcode.com/problems/single-number-ii/

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?


思路:想了好久没想出来,果然这题位运算还是有点麻烦!再见。Single Number I和Single Number III以前见过,所以很快就做出来了,这题看着有点诡异。

这题利用了除了一个数之外其他都出现三次,在每一位记录1出现的次数,然后除余3之后剩余的数就是只出现一次的数。

用one来记录只出现一次的数,two来记录出现两次的数,xThree来记录出现三次数的取反(为了消去出现三次的位)

代码如下:

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int one = 0, two = 0, xThree = 0;
        for(int i = 0; i< nums.size(); i++){
            two |= (nums[i]&one);//记录出现两次的位信息
            one ^= nums[i];//异或记录只出现一次的位信息,如果出现三次就会消去
            xThree = ~(one&two);//记录出现三次的位信息用于消去出现三次的位
            one &= xThree;//消去出现三次的1
            two &= xThree;//消去出现三次的1
        }
        return one;
    }
};
参考:http://www.cnblogs.com/daijinqiao/p/3352893.html

你可能感兴趣的:(LeetCode,算法,bit,manipulation)