20.11.13 LeetCode位運算
阿新 • • 發佈:2020-11-13
一般用法:
And&:一個數and 1取二進位制的末位,可用來判斷整數的奇偶
Xor^:兩數交換:a=a xor b;b = a xor b; a = a xor b; a^a = 0; a^0 = a;
左移<<:在末尾添0,代表該數*2 效率更高,儘量用左移1位代替*2
右移>>:該數除以2,效率更高,儘量用右移1位代替/2
136.給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。 說明: 你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎? 示例 1: 輸入: [2,2,1] 輸出:1 示例2: 輸入: [4,1,2,1,2] 輸出: 4 來源:力扣(LeetCode) 連結:https://leetcode-cn.com/problems/single-number 著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題解:可以利用按位異或a^a=0,a^0=a的性質,將陣列內所有元素依次進行^操作,由於只存在1個數不重複,則^到最後留下的肯定就是該元素。
class Solution { public: int singleNumber(vector<int>& nums) { int ans = 0;for(const int& num:nums) { ans ^=num; } return ans; } };
190.顛倒給定的 32 位無符號整數的二進位制位。 示例 1: 輸入: 00000010100101000001111010011100 輸出: 00111001011110000010100101000000 解釋: 輸入的二進位制串 00000010100101000001111010011100 表示無符號整數 43261596, 因此返回 964176192,其二進位制表示形式為 00111001011110000010100101000000。 示例 2: 輸入:11111111111111111111111111111101輸出:10111111111111111111111111111111 解釋:輸入的二進位制串 11111111111111111111111111111101 表示無符號整數 4294967293, 因此返回 3221225471 其二進位制表示形式為 10111111111111111111111111111111 。 來源:力扣(LeetCode) 連結:https://leetcode-cn.com/problems/reverse-bits 著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
題解:本題直接利用&操作每次獲取輸入的最後一位加到輸出數裡,結合算術左移和右移即可。
class Solution { public: uint32_t reverseBits(uint32_t n) { uint32_t ans = 0; for(int i = 0;i<32;++i) { ans<<=1; ans += n&1; n>>=1; } return ans; } };