给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
我的方法:哈希表。遍历数组,新出现的就加入,已有的就删除,最后剩下的即为结果。时间复杂度O(n),空间复杂度O(n)。
class Solution {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> hashtable;
for (int i = 0;i < nums.size();i++) {
if (hashtable.count(nums[i])) {
--hashtable[nums[i]];
}
else ++hashtable[nums[i]];
}
unordered_map<int, int>::iterator it;
for (it = hashtable.begin();it != hashtable.end();it++) {
if (it->second) return it->first;
}
return 0;
}
};
题解方法:异或运算。由于异或满足交换律和结合律, a xor b xor b = a。
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for (int num : nums) {
single ^= num;
}
return single;
}
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/single-number/solution/zhi-chu-xian-yi-ci-de-shu-zi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
常见位运算符如下表所示。
运算符 | 含义 |
---|---|
& | 与 |
^ | 异或 |
| | 或 |
~ | 取反 |
<< | 左移 |
>> | 右移 |