首页 > 代码库 > LeetCode——Single Number(II)

LeetCode——Single Number(II)

Single Number

 

Given an array of integers, every element appears twice except for one. Find that single one.

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?


思路:

这种类型的题目有两种思路:1、Map映射。2、位运算。

1、Map映射

可以使用使用map统计所有数值出现的次数,然后最后返回满足条件的值。

代码:

Single Number:

class Solution {
public:
    int singleNumber(int A[], int n)   
    {  
        unordered_map<int, bool> ump_ii;  
        for (int i = 0; i < n; i++)  
        {  
            if (!ump_ii.count(A[i])) ump_ii[A[i]] = true;  
            else ump_ii.erase(A[i]);  
        }  
        return ump_ii.begin()->first;  
    }  
};


Single Number II:
class Solution {
public:
	int singleNumber(int A[], int n) {
		unordered_map<int, int> m;
		for (int i = 0; i < n; i++) {
			if (m.count(A[i]) == 0) {
				m[A[i]] = 1;
			} else if (m[A[i]] == 1) {
				m[A[i]] = 2;
			} else if (m[A[i]] == 2) {
				m.erase(A[i]);
			}
		}
		return m.begin()->first;
	}
};
2、位运算

Single Number:两个相同数的异或(^)值为0,Single Number中可以将所有的数求异或运算,那么值为所要求的Single Number。

所以代码为:

class Solution {
public:
    int singleNumber(int A[], int n) {
        int num=A[0];
        for(int i=1;i<n;i++){
            num^=A[i];
        }
        return num;
    }
};
Single Number II:对于除了出现一次之外的所有的整数,其二进制表示中每一位1出现的次数是3的整数倍,将所有这些1清零,剩下的就是最终的数。用ones记录到当前计算的变量为止,二进制1出现“1次”的数位。用twos记录到当前计算的变量为止,二进制1出现“2次”的数位。当ones和twos中的某一位同时为1时表示二进制1出现3次,此时需要清零。即用二进制模拟三进制计算。最终ones记录的是最终结果

代码:

class Solution {
public:
	int singleNumber(int A[], int n)  
    {  
        int ones=0,twos=0,threes=0;
        for(int i=0;i<n;i++){
            twos|=(ones&A[i]);
            ones=ones^A[i];
            threes=(ones&twos);
            twos&=~threes;
            ones&=~threes;
        }
        return ones;
    } 
};
当然进行位运算的时候我们可以将整数(int 32)一位一位运算。

代码:

class Solution {
public:
	int singleNumber(int A[], int n)  
    {  
        int ans = 0;  
        for (int i = 0; i < 32; i++)   
        {  
            int c = 0, d = 1<<i;  
            for (int j = 0; j < n; j++)  
                if (A[j] & d) c++;  
  
            if (c%3) ans |= d;  
        }  
        return ans;  
    } 
};