Single Number I
Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
思路: 异或
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
for(int i = 0; i<nums.size();++i){
res^=nums[i];
}
return res;
}
};
Single Number II
Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
思路:考虑每一位,对每一位进行统计,并建立逻辑关系。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int one = 0 ;
int two = 0;
for(int i = 0; i < nums.size();++i){
one = one^nums[i]&(~two);
two = two^nums[i]&(~one);
}
return one;
}
};
Single Number III
Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].
Note:
The order of the result is not important. So in the above example, [5, 3] is also correct.
Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
思路:对所有数据进行异或,利用异或后的结果根据一定的原则(具体见代码)将两个只出现一次的数字分组进行异或。
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int> res(2,0);
int xo=0;
for(int i = 0 ;i < nums.size();++i)
xo^=nums[i];
int last_bit = (xo&(xo-1))^xo;
for(int i = 0; i<nums.size();++i){
if(nums[i]&last_bit)
res[0]^=nums[i];
else
res[1]^=nums[i];
}
return res;
}
};