LeetCode——260. 只出现一次的数字 III(Single Number III)[中等]——分析及代码(C++)

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。

扫描二维码关注公众号,回复: 13202813 查看本文章

(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% 的用户。

三、其他

暂无。

猜你喜欢

转载自blog.csdn.net/zml66666/article/details/121045461
今日推荐