第一次遇见周赛第二题大败而归的情况,以为前两题总是能秒掉,结果在这第二题卡了接近一个小时抓耳挠腮,最后还是暴力循环超时才通过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)会不符合语义,必须得再加个括号