zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    javascript之数组去重方法
    经典问题之爬楼梯
    javascript之事件循环机制
    javascript之闭包
    javascript之动态改变this上下文
    块级元素的垂直居中对齐
    js数组对象
    javascript-冒泡法排序
    javascript-数组
    javascript-循环
  • 原文地址:https://www.cnblogs.com/chenjx85/p/8903690.html
Copyright © 2011-2022 走看看