LeetCode-693. Binary Number with Alternating Bits

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。

程序分析

按位运算很多时候不同的运算符能体现不同的功能,这需要多多总结,多多练习,多多关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值