給定範圍 [m, n],其中 0 <= m <= n <= 2147483647,返回此範圍內所有數字的按位與(包含 m, n 兩端點)。
示例 1:
輸入: [5,7]
輸出: 4
示例 2:
輸入: [0,1]
輸出: 0
方法一:位移
思路鑑於上述問題的陳述,我們的目的是求出兩個給定數字的二進位制字串的公共字首,這裡給出的第乙個方法是採用位移操作。
我們的想法是將兩個數字不斷向右移動,直到數字相等,即數字被縮減為它們的公共字首。然後,通過將公共字首向左移動,將零新增到公共字首的右邊以獲得最終結果。
演算法如上述所說,演算法由兩個步驟組成:
我們通過右移,將兩個數字壓縮為它們的公共字首。在迭代過程中,我們計算執行的右移運算元。
將得到的公共字首左移相同的運算元得到結果。
class
solution
return m << shift;
}}
方法二:brian kernighan 演算法
思路與演算法
還有乙個位移相關的演算法叫做「brian kernighan 演算法」,它用於清除二進位制串中最右邊的 11。
brian kernighan 演算法的關鍵在於我們每次對 \textitnumber 和 \textit-1number−1 之間進行按位與運算後,\textitnumber 中最右邊的 11 會被抹去變成 00。
基於上述技巧,我們可以用它來計算兩個二進位制字串的公共字首。
其思想是,對於給定的範圍 [m,n][m,n](mclass
solution
return n;
}}
201 數字範圍按位與
給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5,7 輸出 4 示例 2 輸入 0,1 輸出 0 1.暴力 2.規律,len n len m return 0 len n len m 將m,n 二進位制,m和n從左起相同...
位運算 201 數字範圍按位與
給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5 7 輸出 4示例 2 輸入 0 1 輸出 0解題 方法1 位移 所有數字按位與,即找到所有數字的公共字首 所有數字的公共字首,即最大和最小數字的公共字首 故將m和n右移,...
201 數字範圍按位與 lecot
給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5,7 輸出 4 示例 2 輸入 0,1 輸出 0 思路 1.這道題剛看見時,很容易想到迭代所有的數字進行按位與,但因為次數太多會超時 解題規律 sss0 x,sss1 x ...