leetcode 415. Add Strings(大整数相加-大整数加1)

本文详细解析了如何实现大数之间的加法运算,包括两种主要的方法:使用双指针处理进位和通过补齐长度简化计算过程。同时,文章还探讨了大整数加1的算法实现,提供了清晰的代码示例与步骤说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2.

Note:

  1. The length of both num1 and num2 is < 5100.
  2. Both num1 and num2 contains only digits 0-9.
  3. Both num1 and num2 does not contain any leading zero.
  4. 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();	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值