我们先来看题目描述:
给定一个正整数,检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。
示例 1:
输入:n = 5 输出:true 解释:5 的二进制表示是:101示例 2:
输入:n = 7 输出:false 解释:7 的二进制表示是:111.示例 3:
输入:n = 11 输出:false 解释:11 的二进制表示是:1011.提示:
- 1 <= n <= 231 - 1
解决方案
方法一:模拟
思路
从最低位至最高位,我们用对 2 取模再除以 2 的方法,依次求出输入的二进制表示的每一位,并与前一位进行比较。如果相同,则不符合条件;如果每次比较都不相同,则符合条件。
代码
Python3
class Solution: def hasAlternatingBits(self, n: int) -> bool: prev = 2 while n: cur = n % 2 if cur == prev: return False prev = cur n //= 2 return TrueJava
class Solution { public boolean hasAlternatingBits(int n) { int prev = 2; while (n != 0) { int cur = n % 2; if (cur == prev) { return false; } prev = cur; n /= 2; } return true; }C++
class Solution { public: bool hasAlternatingBits(int n) { int prev = 2; while (n != 0) { int cur = n % 2; if (cur == prev) { return false; } prev = cur; n /= 2; } return true; } };C
#define MAX(a, b) ((a) > (b) ? (a) : (b)) int maxConsecutiveChar(const char * answerKey, int k, char ch) { int n = strlen(answerKey); int ans = 0; for (int left = 0, right = 0, sum = 0; right < n; right++) { sum += answerKey[right] != ch; while (sum > k) { sum -= answerKey[left++] != ch; } ans = MAX(ans, right - left + 1); } return ans; } int maxConsecutiveAnswers(char * answerKey, int k) { int cnt1 = maxConsecutiveChar(answerKey, k, 'T'); int cnt2 = maxConsecutiveChar(answerKey, k, 'F'); return MAX(cnt1, cnt2); }复杂度分析
时间复杂度:O(logn) 。输入 n 的二进制表示最多有 O(logn) 位。
空间复杂度:O(1) 。使用了常数空间来存储中间变量。