题目链接:初级算法 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台
思路: 遍历数组,利用集合 检查是由有重复的,有重复的就剔除,最后留下只出现一次的。
class Solution {
public:
int singleNumber(vector<int>& nums) {
set<int> s;
for (int i = 0; i < nums.size(); i++) {
if (s.find(nums[i]) != s.end()) {
s.erase(nums[i]);
}
else {
s.insert(nums[i]);
}
}
return *s.begin();
}
};
解题思考: 看到题解,发现一个很巧妙的方法——位运算,能让时间复杂度降到 。
原理:两个相同的数异或为0;任何数和0异或得0;异或运算满足交换律和结合律。所以可以得到以下代码:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ret = 0;
for (auto e: nums) // 遍历
ret ^= e;
return ret;
}
};