136. Single Number
Description:
Given a non-empty 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?
Difficulty:Easy
Example:
Input: [4,1,2,1,2]
Output: 4
方法: XOR
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
1
)
O\left ( 1 \right )
O(1)
思路:
暴力法:两层循环,时间复杂度不满足要求;
Hash: 先存储,再判断,空间复杂度不满足要求;
异或:a⊕b⊕a = (a⊕a)⊕b = 0⊕b=b
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
for(int i = 0; i < nums.size(); ++i)
res ^= nums[i];
return res;
}
};
进阶版 :Two Single Number
- Time complexity : O ( n ) O\left ( n \right ) O(n)
- Space complexity :
O
(
1
)
O\left ( 1 \right )
O(1)
思路:
还是利用异或的思想,但是有两个单次数的时候,异或的结果是这两个数的异或结果。此时,这个异或结果的二进制中肯定有1的存在,随便找一个1的位置,将数组中所有该位为1的化为一组,为0的划为另一组,这时问题简化成简单版的题目。原因是,这种按照位的划分可以将出现两次的数划分到一起。
class Solution {
public:
vector<int> twoSingleNumber(vector<int>& nums) {
vector<int> res(2, 0);
int temp = 0;
for (int i = 0; i < nums.size(); i++)
temp ^= nums[i];
int index = 0;
while(temp >> index != 1) index++;
for (int i = 0; i < nums.size(); i++)
if (nums[i] >> index == 1)
res[0] ^= nums[i];
for (int i = 0; i < nums.size(); i++)
if (nums[i] >> index == 0)
res[1] ^= nums[i];
return res;
}
};