【力扣3211.生成不含相邻零的二进制字符串】二进制字符串的生成方法、判断二进制数是否有连续0的方法

. - 力扣(LeetCode)

第一次遇见周赛第二题大败而归的情况,以为前两题总是能秒掉,结果在这第二题卡了接近一个小时抓耳挠腮,最后还是暴力循环超时才通过19/20,二进制类型的字符串还是有很多知识点空缺导致的😵‍💫

下来看了灵神的答案讲解,总结如下

题解:

class Solution {
public:
    vector<string> validStrings(int n) {
        vector<string> ans;
        int mask = (1 << n) - 1;
        for (int i = 0; i < (1 << n); i++) {
            int x = mask ^ i;
            if (((x >> 1) & x) == 0) {
                ans.push_back(bitset<18>(i).to_string().substr(18 - n));
            }
        }
        return ans;
    }
};

技巧:1)判断一个二进制数是否有连续的0可以转化为➡取反并判断是否有连续的1

2)一个二进制数取反:将【该数】与【长度相同的全1二进制数】做【异或运算】

3)判断一个二进制数是否有连续的1:将【该二进制数x】与【其本身右移一位后的二进制数】做【与运算】,若不等于0则说明x有连续1

4)获取长度为n的所有二进制数:int i = 0; i < (1 << n); i++

5)将int二进制数(实际是十进制整数)转成二进制数字对应的字符串:

bitset<常量长度>(int i).to_string()

6)bitset类型可以使用.to_string()保留二进制数样式得到字符串

​​​​​​​7)&的优先级低于==号,所以要是写出if (x & (x >> 1) == 0)会不符合语义,必须得再加个括号

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值