137. Single Number II

来源:互联网 发布:永琪和知画圆房了几次 编辑:程序博客网 时间:2024/05/20 04:48

题目: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?

给出一组整数,其中每一个元素出现的次数是3次,除了一个元素,请找出这个元素。
注意:你的算法需要保持在线性时间复杂度,并且尽量不占用额外的空间。

由于其他元素出现的次数都是3次,所以我们需要想方法利用这个3次来消去重复的元素。
用两个整数first, second,初值设为0。
对于任意一个整数 n ,用如下的算式:
first = ( first ^ n ) & ~second;
second = ( second ^ n ) & ~first;
这时 first 的值为 n , second 的值为 0 。
下面我们再循环一次上面的算式,结果 first 的值为 0 ,second 的值为 n。
让我们再循环一次,记过 first 的值为0, second 的值为 0。
这样经过3次循环,n 的值对first 和 second 的结果没有任何影响。
这样方法就出来了,遍历数组中所有元素,然后每次用数组中的元素代替上式中的 n ,这样凡是重复3次的元素的影响最后都被消成了0 , 唯一的那个单独的元素所造成的结果就是只循环一次上式的结果,这样 first 的值就是那个单独的元素。

代码如下:

class Solution {public:    int singleNumber(vector<int>& nums) {        int first = 0, second = 0;        for (auto num : nums) {            first = (first ^ num) & ~second;            second = (second ^ num) & ~first;        }        return first;    }};
0 0
原创粉丝点击