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
Thinking
Check that neighboring bits strictly alternate. A bit-by-bit scan is enough.
Read the lowest bit, shift, and fail if it equals the previous bit.
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)\).
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Solution 2: Bit Manipulation
Thinking
The scan is \(O(\log n)\). \(n\oplus(n\gg 1)\) becomes a run of ones iff bits alternate; then \(n\&(n+1)=0\) confirms it in constant time.
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)\).
1 2 3 4 | |
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 | |
1 2 3 4 | |
1 2 3 4 | |
1 2 3 4 5 6 | |