Description
Given a positive integer, check whether it has alternating bits: namely, if two adjacent bits will
always have different values.
Example 1
Input: 5
Output: True
Explanation:
The binary representation of 5 is: 101
Example 2
Input: 7
Output: False
Explanation:
The binary representation of 7 is: 111.
Example 3
Input: 11
Output: False
Explanation:
The binary representation of 11 is: 1011.
Example 4
Input: 10
Output: True
Explanation:
The binary representation of 10 is: 1010.
Solution 1(C++)
static int x=[](){std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}();
class Solution {
public:
bool hasAlternatingBits(int n) {
long a1, an=2, i=1;
while(an<n){
a1=an;
if(i%2!=0) an=2*a1+1;
else an=2*a1;
i++;
}
return n==1||n==0? true:an==n;
}
};
Solution 2(C++)
static int x=[](){std::ios::sync_with_stdio(false); cin.tie(NULL); return 0;}();
class Solution {
public:
bool hasAlternatingBits(int n) {
int temp = n^n>>1;
return !(temp & temp+1);
}
};
算法分析
解法一是自己写的。虽然比较笨拙,但是个人觉得还是有一些可取之处的。因为找规律的方法虽然原始,但是呢是对数学问题的一种归纳,不是所有的算法程序都是从根源上去描绘问题,解决问题的。描述结果的规律有的时候也能帮助我们达到解决算法问题的目的。
解法二是自己想的。这个方法一开始就想到最根本的地方呢,那就是利用重复的相邻字符。由于有重复的相邻字符,自然而然就想到异或,但是如何让相邻的两个字异或呢,自然就是左移一位或者右移一位了。但是考虑到左移是乘2,末尾补0,变动的位数太多,所以还是考虑右移一位,最高位补0。
仔细想一想n,既然是正数,那么最高位肯定为1。而右移一位之后最高位补0,那么最高位肯定不同。异或肯定为1。而如果不存在相邻相同两位字,那么所有位异或之后都为1。但是如果有相同的,必然有一位异或之后为0。
这是,给异或的结果加1就能体现结果的不同了。一个全都为1,加1,全都为0,另一个无法顺利进位、不会全部为0。
程序分析
按位运算很多时候不同的运算符能体现不同的功能,这需要多多总结,多多练习,多多关注。