1.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
考察知识点:位运算
class Solution {
public:
int singleNumber(vector<int>& nums) {
for(int i=1;i<nums.size();++i)
nums[0]^=nums[i];
return nums[0];
}
};
2.只出现一次的数字 II
给你一个整数数组nums ,除某个元素仅出现一次外,其余每个元素都恰出现三次 。请你找出并返回那个只出现了一次的元素。
考察知识点:位运算
class Solution {
public:
int singleNumber(vector<int>& nums) {
int a=0,b=0;
for(int i=0;i<nums.size();++i)
{
a=(a^nums[i])&~b;
b=(b^nums[i])&~a;
}
return a;
}
};
3.只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按任意顺序返回答案。进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
考察知识点:位运算
思路:
(1)先对所有数字进行一次异或,得到两个出现一次的数字的异或值。
(2)在异或结果中找到任意为 11 的位。
(3)根据这一位对所有的数字进行分组。
(4)在每个组内进行异或操作,得到两个数字。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int ret = 0;
for (int n : nums)
ret ^= n;
int div = 1;
while ((div & ret) == 0)
div <<= 1;
int a = 0, b = 0;
for (int n : nums)
if (div & n)
a ^= n;
else
b ^= n;
return vector<int>{a, b};
}
};
本文介绍如何使用位运算解决三类数字查找问题:在数组中找出只出现一次的数字,包括找出唯一出现一次的数字、在每个数字出现三次的情况下找出只出现一次的数字,以及找出两个只出现一次的数字。
1263

被折叠的 条评论
为什么被折叠?



