一、前言
sheepice开启新的篇章了,虽然现在比较忙,但是如果有空,且写到一些比较有启发的力扣题的时候希望能够发一点点题解,毕竟三叶姐坚持了那么久,也给我有了很好的榜样作用!
sheepice的CSDN地址:大家感兴趣也可以去里面,说不定能学到一点东西哦!
二、leecode每日一题
①首先是今天的每日一题,题目如下:
②题目解答(1)
//版本1,逐步的进行判断
class Solution {
public:
bool hasAlternatingBits(int n) {
int prev = 100; //因为二进制每一位不可能超过2,所以prev比2大就好
while (n != 0) {
int cur = n & 1; //当前判断的位数
if (cur == prev) { //如果与上一位相等就不满足
return false;
}
prev = cur; //前缀等于当前,进行下一次的判断
n >>= 1;
}
return true;
}
};
③题目解答(2)
因为位运算的性质,所以这题其实可以几行代码就解决的。例如一个二进制数为101,如何判断他是交替的呢。首先令u=101,然后u >> 1是等于010的,这一步可以看成让一个本来是101交替的,变成010交替,那么u^(u>>1)等于111,也就是说对于交替进行的数字,必然有其本身抑或本身右移一位后得到的结果位数全部为1!!
//版本二:利用位运算的相关性质
class Solution {
public:
bool hasAlternatingBits(int n) {
long a = n ^ (n >> 1);
//a加1后如果为真,111变成1000与原数按位与必然为0
return (a & (a+1)) == 0;
}
};
三、三叶姐的拓展
这一题之后三叶姐给了一个位运算的入门专题,也是状态压缩的一个入门题目:
①题目如下:
②解答如下
因为数据给的比较小,然后要判断的只是小写字母,因此只需要把每一个单词小写字母出现的情况放在一个二进制数下进行表示就好了的!
//c++版本的解答
class Solution {
public:
int maxProduct(vector<string>& words) {
int n = words.size();
vector<int> dp(n,0);
for(int i = 0; i < n; i++) {
for(int j = 0; j < words[i].size(); j++) {
char u = words[i][j];
//进行每一位1的存储
dp[i] |= (1 << (u - 'a'));
}
}
int ans = 0;
//从头比较到尾,满足无重复数字就进行相关的答案记录
for(int i = 0; i < n - 1; i++) {
for(int j = i+1; j < n; j++) {
if((dp[i] & dp[j]) == 0) {
//这里取最大值的地方可以注意一下
//可以用ans = max(ans, (int)(words[i].size() * words[j].size()));
//因为.size()结构是返回无符号类型的int所以力扣上会报错!!!
if(words[i].size() * words[j].size() > ans)
ans = words[i].size() * words[j].size();
}
}
}
return ans;
}
};