码迷,mamicode.com
首页 > 其他好文 > 详细

Bitwise AND of Numbers Range--LeetCode

时间:2015-04-21 09:42:43      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:内存管理   c++   

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

For example, given the range [5, 7], you should return 4.

思路:第一个思路肯定是从第一个数开始按位与,但是这样的复杂度太高,开始有新的改进,如果这个范围内有2的幂,那么从这个开始按位或即可,这个2的幂要紧挨着n,如果发现这个2的幂次小于m,那么仍然从这个范围开始安装或。

int rangeBitwiseAnd(int m, int n) 
{
	int i;
	int result ;
	for(i=0;;i++)
	if(pow(2,i)>n)
		break;
	if(pow(2,i-1) < m)
	{
		result = m;
		for(i=m+1;i<=n;i++)
		 result  &= i; 
	}   
	else
	{
		result = pow(2,i-1);
		i = pow(2,i-1)+1;
		for(;i<=n;i++)
		 result &= i;
	}     
	return result;
} 

看别人的代码,发现有更快的,对于一个连续的数字序列,两个相邻的两个数最后一位肯定是不一样的,那么只要m!=n,那么最后一位肯定是0,那么我们就看从哪一位开始m==n即可。

int rangeBitwiseAnd(int m, int n) {  
        int offset = 0;  
        while (m && n)  
        {  
            if (m == n)  
            {  
                return m << offset;  
            }  
            m >>= 1;  
            n >>= 1;  
            offset++;  
        }  
  
        return 0;  
    }  


Bitwise AND of Numbers Range--LeetCode

标签:内存管理   c++   

原文地址:http://blog.csdn.net/yusiguyuan/article/details/45165589

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!