前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-415-Add Strings

leetcode-415-Add Strings

作者头像
chenjx85
发布2018-05-22 16:24:09
4210
发布2018-05-22 16:24:09
举报

题目描述:

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

要完成的函数:

string addStrings(string num1, string num2) 

说明:

1、终于碰到大数加法的题目了……两个存储在string里面的十进制数,要计算出相加的结果,结果存储在string里面。

2、模拟人类手工做这种题目的做法就ok了。

首先从末尾开始,两个string中的数字相加,进位记录下来,传递给下一次相加。

如果短的string已经处理完了,那么接着带进位去处理剩下的长的string。

最后如果还有进位的话,再处理一次。

代码如下:

    string addStrings(string num1, string num2) 
    {
        int num1size=num1.size();
        int num2size=num2.size();
        int carry=0;//表示进位
        int t1;//两位数相加的结果
        string res="";
        if(num1size<num2size)
        {
            int j=num2size-1;
            for(int i=num1size-1;i>=0;i--,j--)
            {
                t1=num1[i]-'0'+num2[j]-'0'+carry;//取出的两个字符转化为数字,加上进位
                carry=t1/10;
                t1=t1%10;
                res=to_string(t1)+res;//to_string这个函数真的很方便
            }
            for(;j>=0;j--)//接着处理长的字符串
            {
                t1=num2[j]-'0'+carry;
                carry=t1/10;
                t1=t1%10;
                res=to_string(t1)+res;
            }
            if(carry==1)//最后带进位就在字符串最前面加“1”
                res="1"+res;
            return res;
        }
        else
        {
            int j=num1size-1;
            for(int i=num2size-1;i>=0;i--,j--)
            {
                t1=num2[i]-'0'+num1[j]-'0'+carry;
                carry=t1/10;
                t1=t1%10;
                res=to_string(t1)+res;
            }
            for(;j>=0;j--)
            {
                t1=num1[j]-'0'+carry;
                carry=t1/10;
                t1=t1%10;
                res=to_string(t1)+res;
            }
            if(carry==1)
                res="1"+res;
            return res;
        }
        
    }

上述代码实测18ms,beats 24.67% of cpp submissions。

3、改进:

看到好多人都能刷出12ms的成绩,寻思着怎么改进……

比较浪费时间的也就是to_string函数,还有一些没有必要的中间变量。

我们没有必要使用to_string函数,可以直接把计算出来的数值+'0',就是相应数字的ASCII码。

我们也可以不再定义res字符串,直接修改比较长的那个字符串的值。

代码如下:

    string addStrings(string num1, string num2) 
    {
        int num1size=num1.size();
        int num2size=num2.size();
        int carry=0;//表示进位
        int t1;//两位数相加的结果
        if(num1size<num2size)
        {
            int j=num2size-1;
            for(int i=num1size-1;i>=0;i--,j--,carry=t1/10)
            {
                t1=num1[i]-'0'+num2[j]-'0'+carry;
                num2[j]=(t1%10)+'0';//省去了一些中间步骤t1=t1%10,'0'字符在计算机中用ASCII码存储
            }
            for(;j>=0;j--,carry=t1/10)
            {
                t1=num2[j]-'0'+carry;
                num2[j]=t1%10+'0';
            }
            if(carry==1)
                num2="1"+num2;
            return num2;
        }
        else
        {
            int j=num1size-1;
            for(int i=num2size-1;i>=0;i--,j--,carry=t1/10)
            {
                t1=num2[i]-'0'+num1[j]-'0'+carry;
                num1[j]=t1%10+'0';
            }
            for(;j>=0;j--,carry=t1/10)
            {
                t1=num1[j]-'0'+carry;
                num1[j]=t1%10+'0';
            }
            if(carry==1)
                num1="1"+num1;
            return num1;
        }
        
    }

省去了字符串res的空间,省去了to_string()函数调用的一些时间,省去了一些中间变量的读取时间(计算时间没有省)。

上述代码实测12ms,beats 83.64% of cpp submissions。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要完成的函数:
  • 说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档