给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 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 }