題目:
給定兩個字元串形式的非負整數 num1 和num2 ,計算它們的和。
提示:
num1 和num2 的長度都小于 5100
num1 和num2 都隻包含數字 0-9
num1 和num2 都不包含任何前導零
你不能使用任何內建 BigInteger 庫, 也不能直接将輸入的字元串轉換為整數形式
題解:
public String addStrings(String num1, String num2) {
StringBuilder result = new StringBuilder();
StringBuilder sa = new StringBuilder(num1);
sa = sa.reverse();
StringBuilder sc = new StringBuilder(num2);
sc = sc.reverse();
int length = num1.length()>num2.length()?num1.length():num2.length();
//追加位數
if(num1.length()<length){
for (int i = 0; i < length-num1.length(); i++) {
sa.append("0");
}
}
if(num2.length()<length){
for (int i = 0; i < length-num2.length(); i++) {
sc.append("0");
}
}
//記錄數值加和
int sum = 0;
for (int i = 0; i < length; i++) {
sum = (sa.charAt(i)-'0')+(sc.charAt(i)-'0');
//進位判斷 及 處理
if(sum>=10){
sum = sum%10;
if(sa.length()>=sc.length()){
if(sa.length()<=i+1){
//超出範圍 直接最後一位進位 傳回
result.append(sum);
result.append(1);
break;
}else{
sa.setCharAt(i+1,(char)(sa.charAt(i+1)+1));
}
}else{
if(sc.length()<=i+1){
result.append(sum);
result.append(1);
break;
}else{
sc.setCharAt(i+1,(char)(sa.charAt(i+1)+1));
}
}
}
result.append(sum);
}
return result.reverse().toString();
}
優化後:
public String addStrings(String num1, String num2) {
StringBuilder result = new StringBuilder();、
//倒叙
int s1index = num1.length()-1;
int s2index = num2.length()-1;
//記錄數值加和
int sum = 0;
while(s1index >= 0 || s2index >= 0 || sum!=0){
if(s1index >= 0){
sum += num1.charAt(s1index)-'0';
s1index--;
}
if(s2index >= 0){
sum += num2.charAt(s2index)-'0';
s2index--;
}
//直接取模10
result.append(sum%10);
//将進位加到下次裡
sum = sum/10;
}
return result.reverse().toString();
}
執行效果:
