位运算专题

分享丨【题单】位运算(基础/性质/拆位/试填/恒等式/思维) - 力扣(LeetCode)

Leetcode 3133. 数组最后一个元素的最小值

我的答案与思路:

class Solution {
public:
// 4 --> (100)2    7 --> (0111)2
// 5 --> (101)2    15--> (1111)2
// 6 --> (110)2
// 插入的时候①1 = (1)10 ②10 = (2)10 ③11 = (3)10 ④100 = (4)10 ⑤101 ⑥110 ⑦111
    string getBin(int x){
        string ans = "";
        while (x){
            if(x & 1)   ans += "1";
            else        ans += "0";
            x >>= 1;
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
    string getInsert(int n){
        int sit = n - 1;
        return getBin(sit);
    }
    long long minEnd(int n, int x) {
        // x 一定是整个数组中最小的
        string xbin = getBin(x);
        string inbin = getInsert(n);
        int idx = xbin.length() - 1;
        for(int i = inbin.length() - 1; i >= 0; i --){
            if(idx >= 0){
                while(idx >= 0 && xbin[idx] != '0'){
                    idx --;
                }   // 找到第一个为"0"的地方
                if(idx < 0) xbin = inbin[i] + xbin;
                else    xbin[idx] = inbin[i];
                idx --;
            }else
                xbin = inbin[i] + xbin;
           
        }
        // 将2进制string转换为十进制整数
        long long res = 0;
        for(auto& v: xbin){
            res <<= 1;
            res += (v - '0');
        }
        return res;
    }
};

更加优雅的实现方式:从集合论的角度进行实现

class Solution {
public:
    long long minEnd(int n, int x) {
        n --;   // 插入数位就是n - 1
        long long res = x;
        int i = 0, j = 0;
        while (n >> j){
            if((res >> i & 1) == 0){   // 当x的第i个bit是0(需要填入数)
                // 空位填入n的第j个bit
                res |= (long long) (n >> j & 1) << i;
                j ++;
            }
            i ++;
        }
        return res;
    }
};

优化方法:lowbit

        把 x 取反,用 lowbit 枚举其中的 1,就是要填的空位。

class Solution {
public:
    long long minEnd(int n, int x) {
        n --;   // 插入数位就是n - 1
        long long res = x;
        int j = 0;
        for (long long t = ~x, lb; n >> j; t ^= lb){
            lb = t & -t;
            res |= (long long)(n >> j ++ & 1) * lb;
        }
        return res;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Ocean__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值