题目描述:
Given two non-negative integers num1
and num2
represented as string, return the sum of num1
and num2
.
Note:
- The length of both
num1
andnum2
is < 5100. - Both
num1
andnum2
contains only digits0-9
. - Both
num1
andnum2
does not contain any leading zero. - You must not use any built-in BigInteger library or convert the inputs to integer directly.
类似题目:大数相乘(https://blog.youkuaiyun.com/orangefly0214/article/details/89240688)
思路1:主要是进位的考虑(用了2个指针)
1.首先将进位标志位初始化为0(最低位相加时前面不会有进位)
2. 模拟数字从低位到高位相加,所以创建两个指针分别指向两个字符串的最高位(数字的个位),遍历两个字符串,逐位判断,
将字符串的对应位做加和。获得该位置的进位,以及实际表示值,然后s后append上该位的值。
3.对于最高位的考虑,如果遍历结束进位值仍然是1,说明最高位也有进位,最终的数需要扩展一位。
s还需要append 上1。
4.这样得到的数是一直append得到的,所以是一个加和的反转,所以我们最后返回的时候还需做一次反转才是所求。
实现:
public String addStrings(String num1, String num2) {
int p1=num1.length()-1;
int p2=num2.length()-1;
StringBuilder s=new StringBuilder();
int carry=0;
while(p1>=0||p2>=0){
int x=0,y=0;
if(p1>=0){
x=num1.charAt(p1)-'0';
p1--;
}
if(p2>=0){
y=num2.charAt(p2)-'0';
p2--;
}
int sum=x+y+carry;
carry=sum/10;
sum=sum%10;
s.append(sum);
}
if(carry>0){
s.append(1);
}
return s.reverse().toString();
}
}
leetcode上简单的实现方法,思路和上面是一样的,只不过代码简洁了点
https://leetcode.com/problems/add-strings/discuss/90436/Straightforward-Java-8-main-lines-25ms
public class Solution {
public String addStrings(String num1, String num2) {
StringBuilder sb = new StringBuilder();
int carry = 0;
for(int i = num1.length() - 1, j = num2.length() - 1; i >= 0 || j >= 0 || carry == 1; i--, j--){
int x = i < 0 ? 0 : num1.charAt(i) - '0';
int y = j < 0 ? 0 : num2.charAt(j) - '0';
sb.append((x + y + carry) % 10);
carry = (x + y + carry) / 10;
}
return sb.reverse().toString();
}
}
实现2:对数字进行补齐,是它们一样长,这样只需要一个指针就可以实现遍历
思路:
1.首先将两个整数用0补齐到相同长度,然后逐位计算本位和、进位。
2. 注意最高位计算结束后,需要判断是否存在进位,如果存在进位,需要在结果前补1。
3.最后返回反转后的字符串才是真正的加和。
class Solution {
public String addStrings(String num1, String num2) {
int len1=num1.length();
int len2=num2.length();
String pad="";
StringBuilder res=new StringBuilder();
if(len1!=len2){
if(len1>len2){
for(int i=0;i<len1-len2;i++){
pad+="0";
}
num2=pad+num2;
len2=len1;
}else{
for(int i=0;i<len2-len1;i++){
pad+="0";
}
num1=pad+num1;
len1=len2;
}
}
int sum,carry=0;
for(int i=len1-1;i>=0;i--){
sum=(num1.charAt(i)-'0')+(num2.charAt(i)-'0')+carry;
if(sum>9){
carry=1;
sum-=10;
}else{
carry=0;
}
res.append(sum);
}
if(carry==1){
res.append(1);
}
return res.reverse().toString();
}
}
扩展:大整数加1
题目描述:
输入:15 输出:16
输入:99 输出:100
//变形题:大整数加1
public String addOne(String num) {
StringBuilder sb=new StringBuilder();
int carry=0;
int sum;
for(int i=num.length()-1;i>=0;i--){
if(i==num.length()-1){
sum=(num.charAt(i)-'0')+1;//最低位前面不会产生进位,不需要加carry
}else{
sum=(num.charAt(i)-'0')+carry;
}
if(sum>9){
carry=1;
sb.append(sum-10);
}else{
sb.append(sum);
String sub=num.substring(0, i);
return sub+sb.reverse().toString();
}
}
if(carry>0){
sb.append(1);
}
return sb.reverse().toString();
}