【Leetcode每日一题】2020-08-23 201 数字范围按位与 - 中等 (Python & C++)

来源:力扣

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the
bitwise AND of all numbers in this range, inclusive.

思路:

  1. 2147483647的二进制为31位的1组成,最粗暴的做法是直接用它递归地和所有位于[m, n]之间的数进行按位与,但是这样会超过时间限制。
  2. 其实只要某个数二进制的某一位为0,其他数与之按位与,该位都会为0,对于[m, n]范围内的连续整数,只需要找出m和n的最长公共前缀即可。

解法:

  1. 位移法:将m和n同时向右位移,直到两数相等,再将它们任意一个向左位移同样位数即可;
  2. Brian Kernighan算法:n和(n-1)按位与即可去除二进制中最后一个1,所以对于[m, n],每次让n和(n-1)按位与,直到m为止即可。

Python:

# 位移法
def rangeBitwiseAnd(m, n):
	shift = 0
	while m < n:
		m >>= 1
		n >>= 1
		shift += 1
	return m << shift

# Brain Kernighan
def rangeBitwiseAnd(m, n):
	while m < n:
		n &= n - 1
	return n

C++:

// 位移法
int rangeBitwiseAnd(int m, int n)
{
	int shift = 0;
	while (m < n)
	{
		m >>= 1;
		n >>= 1;
		shift ++;
	}
	return m << shift;
}

// Brain Kernighan
int rangeBitwiseAnd(int m, int n)
{
	while (m < n)
	{
		n &= n - 1;
	}
	return n;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值