leetcode-260-SingleNumber III

问题

题目:[leetcode-260]

思路

可参考这个链接[数组中只出现1次的两个数字(百度面试题)]。下面是我自己的总结:

首先,对于只有一个不同的数字的情形。xor可以解决。但是对于本题,由于出现两个只出现一次的数字。所以,xor的结果是最后这两个数字的xor结果。所以,直接这么做不可以。

不妨这么考虑,由于a和b是出现在同一个数组中。所以没法分开,如果把它们分到不同的数组中,对于这两个不同的数组而言。a和b是可以分别找到的。由于a不等于b,所以它们两的位向量中必然有一位不同。假设第 ci 不同,可以利用第 ci 位与a和b相与的结果把a,b分开。同理,用 ci 位把数组中剩余的数也分开。这样对于这两个数组,分别做xor即可得到这两个数字。

大体流程如下:

  • 把数组分别为各自包含a,b的两个子数组
  • 对这两个子数组求xor分别获得a,b

第一个是核心,怎么划分开。上面说道,利用a和b位向量当中不同的那一位 ci 当做mask。把数组划分开即可。问题是怎么得到mask。mask是位向量当中不同的那一位,那么a^b的结果当中位向量为1的就是二者不同的位。而a^b的结果刚好可以通过对数组xor来得到。

代码

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {

        vector<int> v1;
        vector<int> v2;
        vector<int> res;


        int sz = nums.size();
        int ret = 0; // a^b
        for( int i = 0; i < sz; ++i ){
            ret ^= nums[i];
        }

        // debug
        //std::cout << "ret=" << ret << std::endl;

        int mask = 1;
        while( !(ret&mask) )
        {
            mask <<= 1;
        }

        // debug
        //std::cout << "mask=" << mask << std::endl;

        for( int i = 0; i < sz; ++i ){
            if( nums[i] & mask )    
                v1.push_back(nums[i]);
            else
                v2.push_back( nums[i] );
        }

        int ans1 = singleNumberOne(v1);
        int ans2 = singleNumberOne(v2);

        res.push_back(ans1);
        res.push_back(ans2);

        return res;
    }
private:
    int singleNumberOne( vector<int>& nums ){
        int sz = nums.size();
        int ret = 0;
        for( int i = 0; i < sz; ++i ){
            ret ^= nums[i];
        }
        return ret;
    }
};
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值