java leetcode之[数学问题 Easy]415. 字符串相加

题目的链接在这里https://leetcode-cn.com/problems/add-strings/


题目大意

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。

一、示意图

在这里插入图片描述

二、解题思路


错误代码

代码如下:

class Solution {
 public  String addStrings(String num1, String num2) {
        //两个非负整数 计算他们的和
        //好像写过类似的 但是不管怎么样 肯定是先从后往前开始判断的
        //首先应该是一些边界判断 有一个是空的话 返回的就是另一个
        if(num1==null)
            return num2;
        if(num2==null)
            return num1;
        //就是这里一步用来是num1一定是长一点的 不知道可不可行 因为String毕竟比较特殊
        if(num2.length()>num1.length()){
            //那就把这两个进行互换
            String temp=num1;
            num1=num2;
            num2=temp;
        }

        int num1Len=num1.length();
        int num2Len=num2.length();
        int k=0;
        //从后往前开始判断
        for(int i=num1Len-1,j=num2Len-1;i>=0&&j>=0;i--,j--){
            int x=num1.charAt(i)-'0';
            int y=num2.charAt(j)-'0';
            int sum=x+y;
            //然后要进行一次判断
            if(sum>=10){
                sum%=10;
                //这里是这样的 最好是判断出来哪个比较长 这样就把值给那个长的 感觉有点太绕了 这里还需要判断一下 这个i-1会
                //会不会小于0了
                if(i>0){
                    //重新赋值
                    int tempx=num1.charAt(i-1)-'0'+1;
                    if(tempx==10){
                        k=1;
                    }
                    //然后把这个新的位置设置成新的temp 但是String不提供 需要转换一下
                    StringBuilder sb=new StringBuilder(num1);
                    //[x,y)这样的
                    //也不知道这个可不可行
                    sb.replace(i-1,i,tempx+"");
                    //还得还原呀
                    //我感觉问题就在于 不用把这个替换的分开讨论 直接放在这个里面就行讨论就好了 他这边加号之后 9109 然后就可以继续加了
                    num1=sb.toString();
                }
                //然后就是i就是0 相当于就是需要在插入一个值了
                else{
                    //重新用到StringBuilder
                    StringBuilder sb=new StringBuilder(num1);
                    sb.insert(0,'1');
                    num1=sb.toString();
                }
                //然后就是把这个sum进行替换了
                StringBuilder sb=new StringBuilder(num1);
               // System.out.println(i);
                //还是这里的问题 正常就是i 到i+2的 除非是最后一个
                //这里还有个特殊情况 就是出现前一个是9 加上1 之后变成了两位数
                //把这个k作为一个标记好了
                if(i==0||k==1){
                    sb.replace(i+1,i+2,sum+"");
                }
                else {
                    sb.replace(i, i + 1, sum + "");
                }
                num1=sb.toString();
            }
            else{
                //这个就实际省事
                StringBuilder sb=new StringBuilder(num1);
                sb.replace(i,i+1,sum+"");
                num1=sb.toString();
            }
        }
        //然后因为之前已经判断好哪个长哪个短了 这个时候肯定是已经不用重新赋值了 num1就是最后结构
        return  num1;
    }
}

进位标记

代码如下:

class Solution {
 public static  String addStrings(String num1, String num2) {
        StringBuilder sb=new StringBuilder();
        int len1=num1.length()-1;
        int len2=num2.length()-1;
        int index=0;//这个用来表示进位
        while(len1>=0||len2>=0||index!=0){
            //这个不等于0表示还有进位
            if(len1>=0){
                //len1--也就完成了更新
                index+=num1.charAt(len1--)-'0';
            }
            if(len2>=0){
                //len2--也就完成了更新
                index+=num2.charAt(len2--)-'0';
            }
            //这个时候index就是两次的值了
            sb.append(index%10);
            //然后把index 太妙了
            index/=10;
        }
        //这个时候生成的sb是倒转的 需要换一下
        sb.reverse();
        return  sb.toString();
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值