693. Binary Number with Alternating Bits

题目描述和难度

  • 题目描述:

给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等。

示例 1:

输入: 5
输出: True
解释:
5的二进制数是: 101

示例 2:

输入: 7
输出: False
解释:
7的二进制数是: 111

示例 3:

输入: 11
输出: False
解释:
11的二进制数是: 1011

 示例 4:

输入: 10
输出: True
解释:
10的二进制数是: 1010

思路分析

求解关键:很常规的一个问题了,

参考解答

参考解答1:这一版是我最开始的写法,比较常规,也很容易想到了。

public class Solution {

    public boolean hasAlternatingBits(int n) {
        // 题目说了是正数,所以负数可以直接排除了
        if (n <= 0) {
            return false;
        }
        boolean flag = ((n & 1) == 0);
        while ((n != 0)) {
            n >>= 1;
            boolean curFlag = ((n & 1) == 0);
            if (flag == curFlag) {
                return false;
            } else {
                flag = curFlag;
            }
        }
        // 这种检测,一定会将所有的数位都检查完,因此,
        // 能运行到最后的,一定都会返回 true
        return true;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int n = 10;
        System.out.println(Integer.toBinaryString(n));
        boolean hasAlternatingBits = solution.hasAlternatingBits(n);
        System.out.println(hasAlternatingBits);
    }
}

参考解答2:使用 Java 的库函数 Integer.toBinaryString(n) 经常可以解决大部分关于二进制的问题。

/**
 * @author liwei
 * @date 18/6/29 下午8:43
 */
public class Solution2 {

    public boolean hasAlternatingBits(int n) {
        String nStr = Integer.toBinaryString(n);
        int len = nStr.length();
        for (int i = 0; i < len - 1; i++) {
            if (nStr.charAt(i) == nStr.charAt(i + 1)) {
                return false;
            }
        }
        return true;
    }
}

参考解答3:使用 Java 的库函数 Integer.toBinaryString(n) 并结合正则表达式判断。

public class Solution3 {

    public boolean hasAlternatingBits(int n) {
        String nStr = Integer.toBinaryString(n);
        // 因为是正数,所以一定以 1 开头
        return nStr.matches("(10)*1?");
    }
}

本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0693-binary-number-with-alternating-bits ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com