LeetCode 137. 只出现一次的数字 II

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3

示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99
 1 class Solution {
 2 public:
 3     int singleNumber(vector<int>& nums) {
 4         sort(nums.begin(),nums.end());
 5         int n = nums.size();
 6         int k = nums[0];
 7         int ans = 0;
 8         if(n == 1)
 9             return nums[0];
10         else if(nums[0] != nums[1])
11             return nums[0];
12         for(int i  = 1; i < n;++i)
13         {
14             
15             if(i!= n-1 && nums[i] != nums[i-1] && nums[i] != nums[i+1])
16             {
17                 ans = nums[i];
18                 break;   
19             }
20             else if(i == n-1 && nums[i] != nums[i-1])
21             {
22                 ans = nums[i];
23                 break;   
24             }
25             
26         }
27         return ans;
28     }
29     
30 };
 1 class Solution {
 2 public:
 3     int singleNumber(vector<int>& nums) {
 4         set<int> s(nums.begin(),nums.end());
 5         long long  sum1 = 0;
 6         set<int>::iterator it = s.begin();
 7         for(;it!=s.end();++it)
 8         {
 9             sum1 += *it;
10         }
11         long long sum2 = 0;
12         for(int i = 0;i < nums.size();++i)
13         {
14             sum2 += nums[i];
15         }
16         return (3*sum1 - sum2)/2;
17         
18     }
19     
20 };
1 int singleNumber(vector<int>& nums) {
2     int a = 0, b = 0;
3     for (auto x : nums) {
4         b = (b ^ x) & ~a;
5         a = (a ^ x) & ~b;
6     }
7     return b;
8 }
原文地址:https://www.cnblogs.com/Jawen/p/10872587.html