這道題是leetcode上新出的題目,有興趣做了一下,輕鬆通過,具體代碼如下所示
class Solution {
public:
int rangeBitwiseAnd(int m, int n) {
stack<int> m_stack, n_stack;
int one_num = 0;
int answer = 0;
if (m == n)
{
return m;
}
if (0 == m)
{
return 0;
}
while (0 != m)
{
one_num = m&(m^(m-1));
m_stack.push(one_num);
m -= one_num;
}
while (0 != n)
{
one_num = n&(n^(n-1));
n_stack.push(one_num);
n -= one_num;
}
while (!m_stack.empty() && !n_stack.empty())
{
if (m_stack.top() == n_stack.top())
{
answer += m_stack.top();
m_stack.pop();
n_stack.pop();
}
else
{
break;
}
}
return answer;
}
};
思路如下,首先判斷輸入的合法性,然後去求m的二進制表述中爲1的那些位代表的數字,並將其放入堆棧中,如m=3時,堆棧中有(1,2)這兩個元素,同理將n進行類似的操作,如n=4時,堆棧中有(4)這一個元素,然後對m和n的堆棧同時進行彈棧,當棧頂元素相同的時候,將棧頂元素加入結果中,不同的時候退出循環。
通過這樣的處理,就可以避免去一個個計算每隔元素的1的位置,然後進行與運算。