题目

给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

示例 1:

输入:n = 5
输出:true
解释:5 的二进制表示是:101

示例 2:

输入:n = 7
输出:false
解释:7 的二进制表示是:111.

示例 3:

输入:n = 11
输出:false
解释:11 的二进制表示是:1011.

提示:

1 <= n <= 2^31 - 1

思路

常规的方法,从最低位逐位检测是否满足0和1交替,时间复杂度取决于二进制位数,时间693. 交替位二进制数 - 图1#card=math&code=O%28logn%29&id=pezsz)级别。

代码

逐位检测O(logn)

  1. class Solution {
  2. public boolean hasAlternatingBits(int n) {
  3. // low表示最低位是0还是1,-1表示还未开始判断
  4. int low = -1;
  5. while (n > 0) {
  6. if (low == -1) {
  7. low = n & 1;
  8. n >>= 1;
  9. continue;
  10. }
  11. // 不满足01交替
  12. if (low == (n & 1)) {
  13. return false;
  14. }
  15. low = 1 - low;
  16. n >>= 1;
  17. }
  18. return true;
  19. }
  20. }

O(1)

看了评论果然有常数时间解法,还是比较好理解。不加说明了。

  1. class Solution {
  2. public boolean hasAlternatingBits(int n) {
  3. int a = n ^ (n >> 1);
  4. return (a & (a + 1)) == 0;
  5. }
  6. }