专栏首页chenjx85的技术专栏leetcode-415-Add Strings

leetcode-415-Add Strings

题目描述:

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。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • leetcode-917-仅仅反转字母

    给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。

    chenjx85
  • leetcode-557-Reverse Words in a String III

    chenjx85
  • leetcode-67- Add Binary

    chenjx85
  • 足疗小张和面向对象的7个设计原则

      设计模式在我们的开发中是不可或缺的一部分,很多人会说,我没用那些设计模式啊,我也开发的挺好的,其实不然,我们在开发中都用到了这些设计模式,只不过我们并没有在...

    小菜的不能再菜
  • 关关的刷题日记91 – Leetcode 415. Add Strings

    关关的刷题日记91 – Leetcode 415. Add Strings 题目 Given two non-negative integers num1 an...

    WZEARW
  • Linux DISPLAY 变量设置

    在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环...

    孙杰
  • 2018-11-20 CG Pipeline: 最佳图数据库性能对比--为您的CG生产数据服务

    https://www.google.com.ph/search?q=%E5%9B%BE%E6%95%B0%E6%8D%AE%E5%BA%93%E6%AF%94...

    Albert陈凯
  • 模式登陆的两种方式

    用户2337871
  • 运维必杀技Perf -- Linux下的系统性能调优工具

    来源:刘明 原文地址:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/ ? Perf Even...

    小小科
  • sjtuLib爬虫-Scrapy

    交大的图书馆网站做的真的不好,不好。但是还是要爬。没有做防墙机制,在爬取了15万条记录之后,IP又被图书馆墙了,而且貌似整个实验室都被wall了。。。。

    钱塘小甲子

扫码关注云+社区

领取腾讯云代金券