“21 天好习惯”第一期-8

leetcode每日一题:

次元门

解法 1: 哈希表

标准解法 , 利用哈希表映射 , 也是计数排序.

 class Solution {
 public:
     vector<int> singleNumber(vector<int>& nums) {
         unordered_map<int , int>un_map;
         vector<int>re;

         for(auto ao : nums) un_map[ao] ++;

         for(auto ao : un_map) if(ao.second == 1) re.push_back(ao.first);

         return re;
     }
};

解法 2: 位运算异或 . 空间复杂度: O(1) , 时间复杂度: O(n).

        异或 (xor): 二进制表示下 , 相同为0 , 相异为1. 所以存在偶数个的数值异或为 0.

        由题意可以知道 , 数据只存在两个存在 1 次的数字 , 其余的数字也只存在 2 次 (偶数次) , 那我们如果将全部的数 xor 起来 , 得到的结果就是那两个只存在一次的数字的 xor 值. 接下来要做的就是如何将这两个数字分开因为两个不同的数字 xor 一定不为0 , 所以二进制下会有一位为 1. 这对应着 , 这两个数在该位上一定有一个为 0 , 一个为 1. 所以我们就可以利用这个条件将这两个数 (将这个位上分别为1 , 0 的数分开 , 由于其余的数都为偶数个 , 所以 xor 一样不产生影响) 分开了.

        lowbit() 函数: (xor) & (- xor) , 从右到左取最后一位 1 的二进制大小数. ( 利用二进制观察更加直观.

        eg:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        long XOR = 0;
        for(auto ao : nums) XOR ^= ao;

        int ide = (XOR) & (- XOR);

        int first = 0 , second = 0;
        for(auto ao : nums){
            if(ao & ide) first ^= ao;
            else second ^= ao;
        }

        return {first , second};
    }
};

Day Eight -- 惊鸿照影来.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值