问题描述:实现两个由0~9数字组成的String加和,两个String长度小于5100且不以零开头。不可以使用BigInteger 类库,不可以将字符转换为数字。
思路:既然不能用原生方法,那就用老办法,将数字从末尾开始一位一位加和计算。
原答案:
public static String addStrings(String num1, String num2) {
char[] num1Char=num1.toCharArray();
char[] num2Char=num2.toCharArray();
StringBuffer sb=new StringBuffer();
int add=0;
int i=0;
int []record=new int[Math.max(num1Char.length, num2Char.length)];
for(;i<num1Char.length&&i<num2Char.length;i++){
int sum=(int)num1Char[num1Char.length-i-1]+(int)num2Char[num2Char.length-i-1]+add-96;
add=sum/10;
record[i]=sum%10;
}
if(i<num2Char.length){
for(;i<num2Char.length;i++){
int sum=num2Char[num2Char.length-i-1]+add-48;
add=sum/10;
record[i]=sum%10;
}
}else if(i<num1Char.length){
for(;i<num1Char.length;i++){
int sum=num1Char[num1Char.length-i-1]+add-48;
add=sum/10;
record[i]=sum%10;
}
}
if(add!=0)
sb.append(add);
for(i=record.length-1;i>=0;i--) {
sb.append(record[i]);
}
return sb.toString();
}
最佳答案:
public String addStrings(String num1, String num2) {
if(num1 == null || num2 == null) return num1 == null ? num2 : num1;
if(num1.isEmpty() || num2.isEmpty()) return num1.isEmpty() ? num2 : num1;
if(num1.length() < num2.length())
return helper(num2,num1);
return helper(num1,num2);
}
public String helper(String num1,String num2){
char[]ch1 = num1.toCharArray();
char[]ch2 = num2.toCharArray();
int i1 = num1.length();
int i2 = num2.length();
int carry = 0;
while(i2 >0){
int temp = ch1[--i1]-'0' + ch2[--i2]-'0' + carry;
carry = temp / 10;
ch1[i1] = (char)(temp % 10 + '0');
}
while(carry != 0 && i1 > 0){
int temp = ch1[--i1]-'0' + carry;
carry = temp / 10;
ch1[i1] = (char)(temp%10 + '0');
}
return carry > 0 ? (char)(carry + '0')+ new String(ch1) : new String(ch1);
}
思路是一致的,但是最佳答案中判别了两个字符串长度,从而加快后续的拼接处理。