Welcome to Subscribe On Youtube
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: n = 5 Output: true Explanation: The binary representation of 5 is: 101
Example 2:
Input: n = 7 Output: false Explanation: The binary representation of 7 is: 111.
Example 3:
Input: n = 11 Output: false Explanation: The binary representation of 11 is: 1011.
Constraints:
1 <= n <= 231 - 1
Solutions
Solution 1: Simulation
We cyclically right-shift $n$ until it becomes $0$, checking whether the binary bits of $n$ appear alternately. If during the loop we find that $0$ and $1$ do not appear alternately, we directly return $\textit{false}$. Otherwise, when the loop ends, we return $\textit{true}$.
The time complexity is $O(\log n)$, and the space complexity is $O(1)$.
Solution 2: Bit Manipulation
Assuming $\text{01}$ appears alternately, we can convert all trailing bits to $\text{1}$ through misaligned XOR. Adding $\text{1}$ gives us a power of $2$, which is a number $n$ (where $n$ has only one bit that is $\text{1}$). Then, using $\text{n} \& (\text{n} + 1)$ can eliminate the last $\text{1}$ bit.
At this point, check if it equals $\text{0}$. If so, the assumption holds, and it is an alternating $\text{01}$ sequence.
The time complexity is $O(1)$, and the space complexity is $O(1)$.
-
class Solution { public boolean hasAlternatingBits(int n) { n ^= (n >> 1); return (n & (n + 1)) == 0; } } // Solution 2 class Solution { public boolean hasAlternatingBits(int n) { n ^= (n >> 1); return (n & (n + 1)) == 0; } } -
class Solution { public: bool hasAlternatingBits(int n) { n ^= (n >> 1); return (n & ((long) n + 1)) == 0; } }; // Solution 2 class Solution { public: bool hasAlternatingBits(int n) { n ^= (n >> 1); return (n & ((long) n + 1)) == 0; } }; -
class Solution: def hasAlternatingBits(self, n: int) -> bool: n ^= n >> 1 return (n & (n + 1)) == 0 # Solution 2 class Solution: def hasAlternatingBits(self, n: int) -> bool: n ^= n >> 1 return (n & (n + 1)) == 0 -
func hasAlternatingBits(n int) bool { n ^= (n >> 1) return (n & (n + 1)) == 0 } // Solution 2 func hasAlternatingBits(n int) bool { n ^= (n >> 1) return (n & (n + 1)) == 0 } -
impl Solution { pub fn has_alternating_bits(n: i32) -> bool { let t = n ^ (n >> 1); (t & (t + 1)) == 0 } } // Solution 2 impl Solution { pub fn has_alternating_bits(n: i32) -> bool { let mut x = n ^ (n >> 1); (x & (x + 1)) == 0 } } -
function hasAlternatingBits(n: number): boolean { let prev = -1; while (n !== 0) { const curr = n & 1; if (prev === curr) { return false; } prev = curr; n >>= 1; } return true; } // Solution 2 function hasAlternatingBits(n: number): boolean { n ^= n >> 1; return (n & (n + 1)) === 0; }