標籤:直接 amp git number any bsp base repr sel
題目:數組加一
難度:Easy
題目內容:
Given a non-empty array of digits representing a non-negative integer, plus one to the integer.
The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit.
You may assume the integer does not contain any leading zero, except the number 0 itself.
翻譯:
給定一個非空的數字數組,表示一個非負整數,加上1到整數。
這些數字被儲存起來,使得最重要的數字位於列表的頭部,數組中的每個元素都包含一個數字。
您可以假設這個整數不包含任何前置字元為零,除了數字0本身
Example 1:
Input: [1,2,3]Output: [1,2,4]Explanation: The array represents the integer 123.
Example 2:
Input: [4,3,2,1]Output: [4,3,2,2]Explanation: The array represents the integer 4321.
我的思路:一開始想到的是,用StringBuffer將他們一個一個都取出來,然後轉為int再相加,然後再轉為int數組返回,然後發現,有幾個測試案例特別長。。。。無法用String轉為int或者long。
所以只能考慮遍曆,從尾開始遍曆,如果當前值加上進位 大於9,那麼當前值就為0,並且繼續進位,否則則直接返回。
然後最後退出迴圈的時候也要判斷一下是否最後一位也是有進位,如果是,則最前面比原來多出一位“1”,所以必須重新new一個int[]。
My Code:
1 public int[] plusOne(int[] digits) { 2 int i = digits.length-1; 3 while (i > -1) { 4 if (digits[i] + 1 > 9) { 5 digits[i] = 0; 6 i--; 7 } else { 8 digits[i]++; 9 return digits;10 }11 }12 int[] ans = new int[digits.length+1];13 ans[0] = 1;14 for (int j = 0; j < digits.length; j++) {15 ans[j+1] = digits[j];16 }17 return ans;18 }
我的複雜度:O(n) 空間複雜度也是O(n)
編程過程中的問題:
無
答案代碼:
1 public int[] plusOne(int[] digits) { 2 3 int n = digits.length; 4 for(int i=n-1; i>=0; i--) { 5 if(digits[i] < 9) { 6 digits[i]++; 7 return digits; 8 } 9 10 digits[i] = 0;11 }12 13 int[] newNumber = new int [n+1];14 newNumber[0] = 1;15 16 return newNumber;
答案複雜度:O(n) 空間複雜度也是O(m*n) 和我的一樣
答案思路:和我的是一樣的,也是從尾到頭迴圈,但是最後再退出迴圈的時候因為是+1,此時如果還沒有return,說明digits全是9999...,所以直接return一個最前面是1,其他是0的數組就好了,不需要再將digits後面的值(肯定是0)賦給它。
擴充:67. Add Binary (二進位相加)
輸入兩個String,表示兩個位元,返回一個String表示他們倆的和。
思路:和本題一樣,從最右邊開始計算,同時計算進位符號。
主要思想是用了兩個指標和一個進位變數carry,兩個任何一個大於等於0就繼續加,同時利用StringBuffer()一個一個放進去,最後再反轉。
代碼:
1 public String addBinary(String a, String b) { 2 StringBuilder sb = new StringBuilder(); 3 int i = a.length() - 1, j = b.length() -1, carry = 0; 4 while (i >= 0 || j >= 0) { 5 int sum = carry; 6 if (j >= 0) sum += b.charAt(j--) - ‘0‘; 7 if (i >= 0) sum += a.charAt(i--) - ‘0‘; 8 sb.append(sum % 2); 9 carry = sum / 2;10 } 11 if (carry != 0) sb.append(carry);12 return sb.reverse().toString();13 }
注意,需要將 char - ‘0’ 轉為數組,並且別忘了 i -- 和 j --。
LeetCode第[66]題(Java):Plus One