加一
給定一個由 整數 組成的 非空 數組所表示的非負整數,在該數的基礎上加一。最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。
示例 1:
輸入:digits = [1,2,3] 輸出:[1,2,4] 解釋:輸入數組表示數字 123。
示例 2:
輸入:digits = [4,3,2,1] 輸出:[4,3,2,2] 解釋:輸入數組表示數字 4321。
示例 3:
輸入:digits = [0]
解題思路:給定數組代表一個十進制數,數組的0下標是十進制的高位。從數組尾部開始遍歷,依次進位。
public int[] plusOne(int[] digits) {for (int i = digits.length - 1; i >= 0; i--) {digits[i]++;digits[i] = digits[i] % 10;if(digits[i] != 0) {return digits;}}digits = new int[digits.length + 1];digits[0] = 1;return digits;}
二進制求和
給你兩個二進制字符串 a 和 b ,以二進制字符串的形式返回它們的和。
示例 1:
輸入:a = “11”, b = “1” 輸出:“100”
示例 2:
輸入:a = “1010”, b = “1011” 輸出:“10101”
public String addBinary(String a, String b) {StringBuffer ans = new StringBuffer();int n = Math.max(a.length(), b.length()), carry = 0;for (int i = 0; i < n; ++i) {carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;ans.append((char) (carry % 2 + '0'));carry /= 2;}if (carry > 0) {ans.append('1');}ans.reverse();return ans.toString();}
x 的平方根
給你一個非負整數 x ,計算并返回 x 的 算術平方根 。由于返回類型是整數,結果只保留 整數部分 ,小數部分將被 舍去 。
示例 1:
輸入:x = 4 輸出:2
示例 2:
輸入:x = 8 輸出:2
public int mySqrt(int x) {if (x == 0) {return 0;}int ans = (int) Math.exp(0.5 * Math.log(x));return (long) (ans + 1) * (ans + 1) <= x ? ans + 1 : ans;}
爬樓梯
假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
示例 1:
輸入:n = 2 輸出:2
示例 2:
輸入:n = 3 輸出:3
解題思路:動態規劃
public int climbStairs(int n) {int p = 0, q = 0, r = 1;for (int i = 1; i <= n; ++i) {p = q; q = r; r = p + q;}return r;}
顏色分類
給定一個包含紅色、白色和藍色、共 n 個元素的數組 nums ,原地對它們進行排序,使得相同顏色的元素相鄰,并按照紅色、白色、藍色順序排列。我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。必須在不使用庫內置的 sort 函數的情況下解決這個問題。
示例 1:
輸入:nums = [2,0,2,1,1,0] 輸出:[0,0,1,1,2,2]
示例 2:
輸入:nums = [2,0,1] 輸出:[0,1,2]
解題思路:計數排序
public void sortColors(int[] nums) {int n = nums.length;int ptr = 0;for (int i = 0; i < n; ++i) {if (nums[i] == 0) {int temp = nums[i];nums[i] = nums[ptr];nums[ptr] = temp;++ptr;}}for (int i = ptr; i < n; ++i) {if (nums[i] == 1) {int temp = nums[i];nums[i] = nums[ptr];nums[ptr] = temp;++ptr;}}}