LeetCode——260. 只出现一次的数字 III[Single Number III][中等]——分析及代码[C++]
一、题目
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
示例 1:
输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。
示例 2:
输入:nums = [-1,0]
输出:[-1,0]
示例 3:
输入:nums = [0,1]
输出:[1,0]
提示:
- 2 <= nums.length <= 3 * 10^4
- -2^31 <= nums[i] <= 2^31 - 1
- 除两个只出现一次的整数外,nums 中的其他数字都出现两次
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、分析及代码
1. 位运算
(1)思路
先计算所有元素的异或和 xorSum,则对于 2 个只出现一次的整数 x 和 y,xorSum = x ^ y。
在此基础上,计算 xorSum 二进制的最后一位 1,将 nums 中的元素根据该二进制位为 0 或 1 分为两部分并分别求解异或和,则每部分的异或和就是 x 或 y。
(2)代码
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int xorSum = 0;//所有元素异或和
for (int num : nums) {
xorSum ^= num;
}
int last1 = (xorSum == INT_MIN) ? xorSum : xorSum & (-xorSum);//获取异或和二进制的最后一位1
int xorSum1 = 0, xorSum2 = 0;//将元素按照二进制last1位为0或1分为2类,分别求解异或和
for (int num : nums) {
if ((num & last1) == 0) {
xorSum1 ^= num;
} else {
xorSum2 ^= num;
}
}
return {xorSum1, xorSum2};//每类中只有一个只出现一次的元素,因此该部分异或和就是这一元素
}
};
(3)结果
执行用时 :8 ms,在所有 C++ 提交中击败了 79.88% 的用户;
内存消耗 :9.8 MB,在所有 C++ 提交中击败了 38.12% 的用户。
三、其他
暂无。