[leetcode] 260. Single Number III 解题报告

题目链接:https://leetcode.com/problems/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:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

思路:前面做了只有一个出现一次的数,其他都是出现两次,思路和那题一样。只是这个先将所有数一起异或,然后得到的结果将是两个只出现一次数的异或。然后再检查这个结果的哪一位为1,则说明只出现一次的两个数在这一位肯定不相等。然后就可以根据与这个数相与是否为0将数组分为两半,则这两个只出现一次的数比如分别在这两个数组中。这样问题就回到了上题的思路,只要让子数组内元素全部异或一下,得到的两个数就是最终要的只出现一次的数。

代码如下:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int tem = 0;
        for(auto val: nums) tem ^= val;
        int lowBit = tem&(-tem);
        vector<int> vec1, vec2;
        for(auto val: nums) 
        {
            if(val&lowBit) vec1.push_back(val);
            else vec2.push_back(val);
        }
        int num1 =0, num2 = 0;
        for(auto val: vec1) num1 = num1^val;
        for(auto val: vec2) num2 = num2^val;
        return vector<int>{num1, num2};
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值