LeetCode137只出现一次的数字——位运算
Posted Rogn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode137只出现一次的数字——位运算相关的知识,希望对你有一定的参考价值。
题目
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现三次。找出那个只出现一次的元素。
说明:你的算法应该具有线性时间的复杂度。你可以不使用额外的空间来实现吗?
思路
题目要求线性复杂度,一般的算法做不到,不难想到用位运算。但怎么进行位运算,比较难想到。
b = (b ^ x) & ~a;
a = (a ^ x) & ~b;
^ 相当于除去原有元素,添加新元素, a &~ b 相当于从a集合中除去b集合中的所有元素。
int len = nums.size(); for(int i =0;i < len;++i)
{ b = (b ^ nums[i]) & ~a; a = (a ^ nums[i]) & ~b;
}
出现一次的存在b中,第二次出现从b中清除同时会存在a中,第三次出现会从b中清除。最终出现一次的都存在b中,出现两次的都存在a中。
例如:[1,2,2,1,1,2,99]
b={0} | {1} | {1,2} | {1} | {0} | {0} | {0} | {99} |
a={0} | {0} | {0} | {2} |
{1,2} |
{2 | {0} | {0} |
代码
1 class Solution { 2 public: 3 int singleNumber(vector<int>& nums) { 4 int a = 0, b = 0; 5 for (auto x : nums) { 6 a = (a ^ x) & ~b; 7 b = (b ^ x) & ~a; 8 } 9 return a; 10 } 11 }; 12 13 static const auto __lamda = []() { 14 std::ios::sync_with_stdio(false); 15 std::cin.tie(nullptr); 16 return nullptr; 17 }();
参考链接:https://leetcode-cn.com/problems/single-number-ii/comments/
以上是关于LeetCode137只出现一次的数字——位运算的主要内容,如果未能解决你的问题,请参考以下文章