力扣第66題、加一
給定一個由整數組成的非空數組所表示的非負整數,在該數的基礎上加一。
最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入: [1,2,3]
輸出: [1,2,4]
解釋: 輸入數組表示數字 123。
示例 2:
輸入: [4,3,2,1]
輸出: [4,3,2,2]
解釋: 輸入數組表示數字 4321。
解題思路
1. 這道題需要整理出來有哪幾種情況,在進行處理會更舒服
2. 末位無進位,則末位加一即可,因爲末位無進位,前面也不可能產生進位,比如 45 => 46
3. 末位有進位,在中間位置進位停止,則需要找到進位的典型標誌,即爲當前位 %10後爲 0,則前一位加 1,直到不爲 0 爲止,比如 499 => 500
4. 末位有進位,並且一直進位到最前方導致結果多出一位,對於這種情況,需要在第 2 種情況遍歷結束的基礎上,進行單獨處理,比如 999 => 1000
代碼:
class Solution {
public int[] plusOne(int[] digits) {
int len=digits.length;
for(int i=len-1;i>=0;i--){
digits[i]++;
digits[i]%=10;
if(digits[i]!=0){
return digits;
}
}
digits=new int[len+1];
digits[0]=1;
return digits;
}
}
力扣第67題、二進制求和
給你兩個二進制字符串,返回它們的和(用二進制表示)。
輸入爲 非空 字符串且只包含數字 1 和 0。
示例 1:
輸入: a = “11”, b = “1”
輸出: “100”
示例 2:
輸入: a = “1010”, b = “1011”
輸出: “10101”
提示:
- 每個字符串僅由字符 ‘0’ 或 ‘1’ 組成。
- 1 <= a.length, b.length <= 10^4
- 字符串如果不是 “0” ,就都不含前導零。
解題思路:
這裏可以先獲取到兩個字符串的末尾,然後通過指針的移動進行相加,a[i]+a[j]取餘2之後的結果,爲1就保留,爲0的話,說明可能兩者都是0,或者兩者都是1,產生了進位,我們可以記錄下這個進位,等到兩個指針再次向前移動後,加上進位的結果,繼續判斷是否需要繼續進位,循環結束後,判斷記錄進位值是否大於0,大於的話,我們可以直接在前面再加上一個“1”,或者進行(t%2).
代碼:
class Solution {
public:
string addBinary(string a, string b) {
int i=a.length()-1;
int j=b.length()-1;
string ret="";
int t=0;
while(i>=0||j>=0){
if (i>=0&&a[i]=='1') t++;
if (j>=0&&b[j]=='1') t++;
ret+='0'+(t%2);
t=t/2;
j--;
i--;
}
if (t>0) ret+='0'+(t%2);
reverse(ret.begin(),ret.end());
return ret;
}
};
關注公衆號,奈斯雜文,菜鳥小謝帶你學你java,帶你刷算法。