【LeetCode】476.Number Complement_EASY(二)
476.Number Complement
Description:
Given a positive integer, output its complement number. The complement strategy is to flip the bits of its binary representation.Note:
1. The given integer is guaranteed to fit within the range of a 32-bit signed integer.
2. You could assume no leading zero bit in the integer’s binary representation.Example 1:
Input: 5
Output: 2
Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2.Example 2:
Input: 1
Output: 0
Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0.
以上是題目,因為例子解釋得很清楚就不翻譯題目內容了。
第一眼看這題,就想咋這麼簡單,取反操作不就完了,然後就gg了…
錯誤程式碼:
public class Solution {
public int findComplement(int num) {
return ~num;
}
}
錯誤結果:
呵呵,大兄弟,你好像忘了int型別在java裡是儲存為補碼形式的32位數了。
那就趕緊重新整理思路,其實取反操作是沒啥問題,問題是要進行怎樣的操作才能保證前導零不變的同時對其取反,容易想到以下兩個與操作:
1. 輸入數取反前的前導零位在取反後與“0”進行按位與操作;
2. 輸入數取反前最左邊的最高一位及其之後的位在取反後與“1”進行按位與操作;
即我們需要得到一個數,這個數取輸入數的二進位制形式最左邊的最高一位且高位後面全部補“1”。
就得到如下程式碼:
public class Solution {
public int findComplement(int num) {
return ~num&((Integer.highestOneBit(num)<<1)-1);
}
}
結果正確。
PS: highestOneBit(i):這個函式的作用是取 i 這個數的二進位制形式最左邊的最高一位且高位後面全部補零,最後返回int型的結果。
再進一步想,輸入數最左邊的最高位肯定是“1”,取反後為“0”,那進行與操作肯定是“0”,所以在這裡我們可以把左移運算省略,即:
public class Solution {
public int findComplement(int num) {
return ~num&(Integer.highestOneBit(num)-1);
}
}
完成。
還是一行程式碼的事兒……主要還是java的基礎函式吧。
相關文章
- 嘗試 Leetcode(二)LeetCode
- leetcode -- 二進位制LeetCode
- leetcode -- 二分查詢LeetCode
- leetcode第二次LeetCode
- leetcode——二分查詢LeetCode
- LeetCode 對稱二叉樹LeetCode二叉樹
- 用 Rust 刷 leetcode 第二題RustLeetCode
- LeetCode 第二題兩數相加LeetCode
- 每日leetcode——二分查詢LeetCode
- Leetcode 704 二分查詢LeetCode
- LeetCode 74——搜尋二維矩陣LeetCode矩陣
- Leetcode 176. 第二高的薪水LeetCode
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- LeetCode——671. 二叉樹中第二小的節點LeetCode二叉樹
- LeetCode入門指南 之 二叉樹LeetCode二叉樹
- leetcode解題模板 —— 二分查詢LeetCode
- LeetCode.617. 合併二叉樹LeetCode二叉樹
- LeetCode654. 最大二叉樹LeetCode二叉樹
- LeetCode617. 合併二叉樹LeetCode二叉樹
- LeetCode演算法—二分查詢LeetCode演算法
- leetcode240——搜尋二維矩陣(medium)LeetCode矩陣
- LeetCode入門指南 之 二分搜尋LeetCode
- leetcode 617.合併二叉樹 JavaLeetCode二叉樹Java
- LeetCode第三題之二:編碼實現LeetCode
- LeetCode-110-平衡二叉樹LeetCode二叉樹
- 如何讀取leetcode中的二維陣列LeetCode陣列
- [LeetCode-SQL-Easy]176. 第二高薪水LeetCodeSQL高薪
- [LeetCode] H-Index II 求H指數之二LeetCodeIndex
- 5分鐘瞭解二叉樹之LeetCode裡的二叉樹二叉樹LeetCode
- LeetCode-190-顛倒二進位制位LeetCode
- LeetCode解題記錄(貪心演算法)(二)LeetCode演算法
- 【LeetCode】98. 驗證二叉搜尋樹LeetCode
- LeetCode刷題之路:67. 二進位制求和LeetCode
- LeetCode 95 | 構造出所有二叉搜尋樹LeetCode
- LeetCode 104.二叉樹的最大深度LeetCode二叉樹
- leetcode1552題解【二分+貪心】LeetCode
- leetcode 每日一題 617 合併二叉樹LeetCode每日一題二叉樹
- 【Leetcode千題】617. 合併二叉樹LeetCode二叉樹