【題解】Bitwise AND of Numbers Range

這道題是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的位置,然後進行與運算。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章