这道题是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的位置,然后进行与运算。