C++給定範圍進行按位與運算
阿新 • • 發佈:2019-01-04
LeetCode上的題目:
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.
給定一個範圍,將範圍內的所有的數(包含首尾的數)進行按位與,返回結果。
冥思苦想寫了一堆程式碼,結果單行程式碼就解決了,看來基礎還是太太太薄弱了。
以下是自寫程式碼,雖然思想是對的,但是隨著輸入數值變大,運算速度出奇的慢,直接超時。
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
int m=5,n=7;
int result=0,x=m;
int bit;
int s=0;
int lon=n-m;
while(x!=0)//計算最小數m的二進位制位數
{
x=x/2;
s++;
}
for(int i=0;i<s;i++)//比m位數還多的位,和m相與肯定為0
{
int num=m;
bit =0;
for(int j=m;j<n+1;j++)
{
num=j;
num=num/pow(2.0,i);
bit=num%2;
if(bit==0) j=n+1;
}
if (bit==1)
{
result+=pow(2.0,i);
}
cout<<result<<endl;
}
system("pause" );
return 0;
}
執行結果4
若m和n相差很大,則超時。
再看看人家的單行程式碼:
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
return (m == n) ? m : (rangeBitwiseAnd(m >> 1, n >> 1) << 1);
}
};
雖然不太理解,但是實在佩服。