力扣 第415題 字符串相加 與第67題 二進制求和
第415題 字符串相加
題目
給定兩個字符串形式的非負整數 num1 和num2 ,計算它們的和。
注意:
num1 和num2 的長度都小於 5100.
num1 和num2 都只包含數字 0-9.
num1 和num2 都不包含任何前導零。
你不能使用任何內建 BigInteger 庫, 也不能直接將輸入的字符串轉換爲整數形式。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-strings
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
暴力版
對相對短的字符串,前面用零補齊
然後拆分爲單字符串進行累加求和
public static String addStrings(String num1, String num2) {
//取得兩個字符串的長度
int sc1 = num1.length();
int sc2 = num2.length();
int diff = sc1 - sc2;
StringBuilder sb = new StringBuilder();
//對長度短的字符串前面填零補齊
if (diff > 0) {
for (int i = 0; i < diff; i++) {
sb.append("0");
}
sb.append(num2);
num2 = sb.toString();
} else {
diff = -diff;
for (int i = 0; i < diff; i++) {
sb.append("0");
}
sb.append(num1);
num1 = sb.toString();
}
//將字符串分割爲字符數組
char[] cs1 = num1.toCharArray();
char[] cs2 = num2.toCharArray();
int flag = 0;
String sum = "";
for (int i = cs1.length - 1; i >= 0; i--) {
//如果和大於10,則 和減去10,且 進位爲1
if (flag + cs1[i] - 48 + cs2[i] - 48 >= 10) {
sum = (flag + cs1[i] - 48 + cs2[i] - 48 - 10) + sum;
flag = 1;
} else {
//如果和小於10,則進位爲0
sum = (flag + cs1[i] - 48 + cs2[i] - 48) + sum;
flag = 0;
}
}
//對最後的進位進行處理
if (flag == 1) {
sum = 1 + sum;
}
return sum;
}
進階版
public static String addStrings2(String num1, String num2) {
int jinwei = 0;
//賦值兩個字符串的長度
int i = num1.length() - 1;
int j = num2.length() - 1;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0 || jinwei > 0){
//取得各個位數的值
int aNum = i>=0 ? num1.charAt(i--) - '0':0;
int bNum = j>=0 ? num2.charAt(j--) - '0':0;
//計算數組a和數組b中 對應位置值與 進位 的和
sb.append((aNum + bNum + jinwei) % 10);
//進位
jinwei = (aNum + bNum + jinwei) / 10;
}
//倒敘輸出
return sb.reverse().toString();
}
遇見的錯誤
Line 10: error: cannot find symbol [in __Driver__.java]
錯誤原因:
檢查發現在自己本地測試用的方法名爲addStrings2,而力扣給定的默認名爲addStrings,將方法名修改後,就測試成功了
測試代碼結果正確並可提交
第67題 二進制求和
題目
給定兩個二進制字符串,返回他們的和(用二進制表示)。
輸入爲非空字符串且只包含數字 1 和 0。
示例 1:
輸入: a = "11", b = "1"
輸出: "100"
示例 2:
輸入: a = "1010", b = "1011"
輸出: "10101"
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/add-binary
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
思路與上題一樣,直接優化版
public static String addBinary(String a, String b) {
int jinwei = 0;
int i = a.length() - 1;
int j = b.length() - 1;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0 || jinwei > 0){
int aNum = i>=0 ? a.charAt(i--) - '0':0;
int bNum = j>=0 ? b.charAt(j--) - '0':0;
sb.append((aNum + bNum + jinwei) % 2);
jinwei = (aNum + bNum + jinwei) / 2;
}
return sb.reverse().toString();
}