classSolution: defhasAlternatingBits(self, n: int) -> bool: prev = 2 while n: cur = n % 2 if cur == prev: returnFalse prev = cur n //= 2 returnTrue
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { publicbooleanhasAlternatingBits(int n) { intprev=2; while (n != 0) { intcur= n % 2; if (cur == prev) { returnfalse; } prev = cur; n /= 2; } returntrue; } }
[sol1-C#]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
publicclassSolution { publicboolHasAlternatingBits(int n) { int prev = 2; while (n != 0) { int cur = n % 2; if (cur == prev) { returnfalse; } prev = cur; n /= 2; } returntrue; } }
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: boolhasAlternatingBits(int n){ int prev = 2; while (n != 0) { int cur = n % 2; if (cur == prev) { returnfalse; } prev = cur; n /= 2; } returntrue; } };
[sol1-C]
1 2 3 4 5 6 7 8 9 10 11 12
boolhasAlternatingBits(int n) { int prev = 2; while (n != 0) { int cur = n % 2; if (cur == prev) { returnfalse; } prev = cur; n /= 2; } returntrue; }
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10
funchasAlternatingBits(n int)bool { for pre := 2; n != 0; n /= 2 { cur := n % 2 if cur == pre { returnfalse } pre = cur } returntrue }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12
var hasAlternatingBits = function(n) { let prev = 2; while (n !== 0) { const cur = n % 2; if (cur === prev) { returnfalse; } prev = cur; n = Math.floor(n / 2); } returntrue; };
复杂度分析
时间复杂度:O(\log n)。输入 n 的二进制表示最多有 O(\log n) 位。
空间复杂度:O(1)。使用了常数空间来存储中间变量。
方法二:位运算
思路
对输入 n 的二进制表示右移一位后,得到的数字再与 n 按位异或得到 a。当且仅当输入 n 为交替位二进制数时,a 的二进制表示全为 1(不包括前导 0)。这里进行简单证明:当 a 的某一位为 1 时,当且仅当 n 的对应位和其前一位相异。当 a 的每一位为 1 时,当且仅当 n 的所有相邻位相异,即 n 为交替位二进制数。
将 a 与 a + 1 按位与,当且仅当 a 的二进制表示全为 1 时,结果为 0。这里进行简单证明:当且仅当 a 的二进制表示全为 1 时,a + 1 可以进位,并将原最高位置为 0,按位与的结果为 0。否则,不会产生进位,两个最高位都为 1,相与结果不为 0。
结合上述两步,可以判断输入是否为交替位二进制数。
代码
[sol2-Python3]
1 2 3 4
classSolution: defhasAlternatingBits(self, n: int) -> bool: a = n ^ (n >> 1) return a & (a + 1) == 0
[sol2-Java]
1 2 3 4 5 6
classSolution { publicbooleanhasAlternatingBits(int n) { inta= n ^ (n >> 1); return (a & (a + 1)) == 0; } }
[sol2-C#]
1 2 3 4 5 6
publicclassSolution { publicboolHasAlternatingBits(int n) { int a = n ^ (n >> 1); return (a & (a + 1)) == 0; } }
[sol2-C++]
1 2 3 4 5 6 7
classSolution { public: boolhasAlternatingBits(int n){ long a = n ^ (n >> 1); return (a & (a + 1)) == 0; } };
[sol2-C]
1 2 3 4
boolhasAlternatingBits(int n) { long a = n ^ (n >> 1); return (a & (a + 1)) == 0; }
[sol2-Golang]
1 2 3 4
funchasAlternatingBits(n int)bool { a := n ^ n>>1 return a&(a+1) == 0 }
[sol2-JavaScript]
1 2 3 4
var hasAlternatingBits = function(n) { const a = n ^ (n >> 1); return (a & (a + 1)) === 0; };