开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情
题目、415. 字符串相加
原题链接:415. 字符串相加
题目描述:
给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。
/
示例 1:
输入:num1 = "11", num2 = "123"
输出:"134"
/
示例 2:
输入:num1 = "456", num2 = "77"
输出:"533"
/
示例 3:
输入:num1 = "0", num2 = "0"
输出:"0"
解题思路:
字符串相加,却不可以将字符直接转化为整形来运算,而且需要输出的依旧是字符串,那么为了得到每个位置上的数字,我们可以利用ASCII码值的加减来获取。
我们首先获取字符串的长度num.length();,然后也就可以确定个位数数字的下标:num.length() - 1;
我们从最末尾数字开始遍历,当前位置的数字通过当前位置的字符减去符号’0‘获取:
'0' - '0' = 0;
'1' - '0' = 1;
'2' - '0' = 2;
...
'9' - '0' = 9;
知道获取到当前位置数字的方法后,我们依次将两个字符串相同位置上的数字相加,同时设置一个add参数,记录满十进一的数位。
那么我们每次就将两数字之和的个位数连接进结果的字符串中,十位数则累加进下一次的两数之和中,最终也就得到了我们需要的字符串。
还需要注意的是,我们从个位数开始遍历,所以得到的字符串是从最小位数字开始的,还需要将字符串反转一下,才算完成。
提交代码:
class Solution {
public String addStrings(String num1, String num2) {
StringBuffer sb = new StringBuffer();
//从最小位数字下标
int index_1 = num1.length() - 1;
int index_2 = num2.length() - 1;
int add = 0; //满十进一
while(index_1 >= 0 || index_2 >=0 || add != 0){ //从最低位数字开始遍历
//该数位存在数字,记录下来
int n1 = index_1 >= 0?num1.charAt(index_1)-'0':0;
int n2 = index_2 >= 0?num2.charAt(index_2)-'0':0;
//同数位数字相加,同时加上满十进一的数
int sum = n1 + n2 + add;
//将个位的数字转换为字符,连接起来
sb.append(sum % 10);
//记录满十进一
add = sum / 10;
//向高位数字遍历
--index_1;
--index_2;
}
sb.reverse(); //我们从后向前连接数字,连接完成后需要翻转过来才是原本的数字
return sb.toString();//输出字符串
}
}
提交结果: