记一段《能力陷阱》的一段话:
我们很乐于去做那些我们擅长的事,于是就会一直去做,最终就使得我们会一直擅长那些事。做得越多,就越擅长,越擅长就越愿意去做。这样的一个循环能让我们在这方面获得更多的经验,但却容易陷入能力陷阱,在其他方面无法突破。
温水煮青蛙—— 每个人都要特别警惕这种能力陷阱,避免把大量时间花在日常琐事上。
与君共勉
关于二进制的问题主要涉及以下几种操作:
- 与
- 或
- 非
- 异或
- 左右移动
693. 交替位二进制数 该题是在小米公司面试过程中被问到的,当时只想到用异或操作并给出了自己的思路。
这次我们一起来看一下这道题:
题意:给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等。
1.面试官想要的答案
1.1 发现规律
二进制交替不相等,无非就两种情况:
…0101
…1010
先左右移动试一下:
| n | 二进制 | n << 1 | n>>1 |
|---|---|---|---|
| 5 | 101 | 1010 | 10 |
| 10 | 1010 | 10100 | 0101 |
这里有个基础知识:
- 正数左移等价于低位补0,相当于乘以2的操作;
- 正数右移等价于高位补0,相当于除以2的操作;
- 高位在左,低位在右,别搞错了;
尝试这将左右移后结果和原数做异或操作
异或的作用:
相同的数异或,结果为0;
0与任意数异或,结果是自身;
| n | 二进制 | n>>1 | n & n>>1) |
|---|---|---|---|
| 5 | 101 | 10 | 111 |
| 8 | 1010 | 101 | 1111 |
| 10 | 10100 | 0101 | 11101 |
通过上面的表格:
我们可以发现:满足条件的数,右移之后与自身异或后全是1。(PS:左移没有这个规律,不信可以手动试一下)
1.2 利用规律
接下来我们的问题:
如何判断一个数的二进制每一位都是1呢?
可以考虑,逆否命题 :能不能把每一位都变成0
这样只需要判断结果等于0即可。
动动手试一下吧!!!
| n | 二进制 | n+1的二进制 |
|---|---|---|
| 1 | 1 | 10 |
| 3 | 11 | 100 |
| 7 | 111 | 1000 |
| 15 | 1111 | 10000 |
到这里对于有计算机基础的人应该都明白啦,兼顾一下其它专业的朋友。(PS:计算机中存储位数是相等的,无非就是补0)
| n | 二进制 | n+1的二进制 |
|---|---|---|
| 1 | 00000001 | 00000010 |
| 3 | 00000011 | 00000100 |
| 7 | 00000111 | 00001000 |
| 15 | 00001111 | 00010000 |
这两者进行与操作可以将所有位全部变成0.这样我们的目的就达到啦。
1.3 TIC(Talk is cheap)
这里我们需要考虑整数溢出的情况:
public boolean hasAlternatingBits(int n) {
public boolean hasAlternatingBits(int n) {
long tmp = (n ^ (n>>1));
return (tmp & (tmp+1)) == 0;
}
2. 笨思妙想
二进制中只存在0和1,如果不是交替出现,则必然会出现00 或者 11。
2.1 利用二进制字符串
public boolean hasAlternatingBits2(int n) {
String binaryString = Integer.toBinaryString(n);
return binaryString.contains("00") || binaryString.contains("11");
}
2.2 遍历法1
逻辑运算:与操作
public boolean hasAlternatingBits(int n) {
while(n>0)
{
int last =n&1; //最后一位
int next=(n>>1)&1; //第二位
if(last ==next) return false;
n=(n>>1);
}
return true;
}
2.2 遍历法2
算术运算:取余 & 除
将十进制转化为二进制
public boolean hasAlternatingBits(int n) {
while(n>0)
{
int last =n % 2; //最后一位
int next= n / 2 % 2; //倒数第二位
if(cur==next) return false;
n= n / 2 ;
}
return true;
}
2.3 总结
本质上2.1 和 2.2的实现原理是一样的。
n % 2 == n % 1
n / 2 == n >> 1
3. XCD
对于像我这种没有ACM等算法相关经历的开发者,在面试的过程中,难免遇到自己解不出来的算法题。个人认为能向面试官展示自己思路和分析逻辑,只要能答道点上,都还是有机会的。
不过刷算法肯定是百利而无一害的。
后续我会将算法的代码专门整理到Github上面的。

探讨了《能力陷阱》的概念,提醒人们避免过度依赖已掌握技能,同时深入解析了一道涉及二进制操作的算法题,展示了多种解题思路。
313

被折叠的 条评论
为什么被折叠?



