本文主要是介绍693. Binary Number with Alternating Bits,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
693. 交替位二进制数
给定一个正整数,检查他是否为交替位二进制数:换句话说,就是他的二进制数相邻的两个位数永不相等。
示例 1:
输入: 5 输出: True 解释: 5的二进制数是: 101
示例 2:
输入: 7 输出: False 解释: 7的二进制数是: 111
示例 3:
输入: 11 输出: False 解释: 11的二进制数是: 1011
示例 4:
输入: 10 输出: True 解释: 10的二进制数是: 1010
解法一
//时间复杂度O(logn), 空间复杂度O(1)
class Solution {
public:bool hasAlternatingBits(int n) {int flag = (n & 1);//0 or 1while(n > 0) {if(flag != (n & 1)) return false;flag = !flag;n >>= 1;}return true;}
};
解法二
//时间复杂度O(1), 空间复杂度O(1)
class Solution {
public:bool hasAlternatingBits(int n) {// n ^ (n >> 1) 等于0...1111时,trueint t = exp2((int)log2(n));return ( n ^ (n >> 1) ) == ( t | (t - 1) );}
};
思路:
解法一
按照题意,依次检查每个位是否是交替位,不是则返回false。
解法二
使用按位异或运算符^,如果它是交替二进制位的数字, n ^ (n >> 1)应该是0...001111.1111的形式(从n最高位起,该位及其右所有位为1)。例如n为5时(为了方便书写,假设n是8位整数,32位同理):
n 0000 0101n>>1 0000 0010n^(n>>1) 0000 0111
那为了检查n^(n>>1)是否是00000111,需要构造一个t,这个t只有n的最高位为1,其余位都为0
t = exp2((int)log2(n));
n为5时,t等于0000 0100。则n=5时,下列表达式为0000 0111:
t | (t - 1)
t | (t - 1)表示,从n最高位开始,最高位及右边所有位都为1。可以用它来检查n ^ (n >> 1)。返回二者是否相等。
这篇关于693. Binary Number with Alternating Bits的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!