• leetcode_字节跳动_挑战字符串_字符串相乘


      字符串相乘
     

    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

    示例 1:

    输入: num1 = "2", num2 = "3"
    输出: "6"

    示例 2:

    输入: num1 = "123", num2 = "456"
    输出: "56088"

    说明:

    1. num1 和 num2 的长度小于110。
    2. num1 和 num2 只包含数字 0-9
    3. num1 和 num2 均不以零开头,除非是数字 0 本身。
    4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理

    一开始看到这个题目,当然首先想到的是小学就学的进制乘法,那种方法要记录进位和计算当前位的结果,实现起来比较简单。

    例子:

           1 2 3

           4 5 6

    --------------是不是很熟悉。

            和我们的习惯每次计算下面一个位数乘上面的数的时候就做一次加法运算,而不是全部乘起来再做 加法运算。 

    class Solution {
    public:
        string multiply(string num1, string num2) {
            /*****蛮力法--O(n^2)****/
            int len1 = num1.length();
            int len2 = num2.length();
            
            if((len1==1&&num1[0]=='0')||(len2==1&&num2[0]=='0')) return "0";
            
            char *res = new char[len1+len2+10];
            memset(res,0,sizeof(char)*(len1+len2+10));
            
            int pos=0;//记录第几位
            int value=0;//记录进位数
            for(int i=len1-1;i>=0;i--){
                pos=len1-i-1;
                value=0;
                for(int j=len2-1;j>=0;j--){
                    if(res[pos]>='0') res[pos]-='0';//便于计算
                    int val = (num1[i]-'0')*(num2[j]-'0');//获得乘积
                    int val1 = value+val%10+res[pos];//获得位上累加数
                    //cout<<num1[i]<<"--"<<num2[j]<<"---"<<val<<"--"<<val1<<endl;
                    if(val1/10==0){//相加无进位
                        value = val/10;//获得进位
                        res[pos++] = val1+'0';//获得位上结果
                    }
                    else{
                        value = val/10+val1/10;//获得进位
                        res[pos++] = val1%10+'0';//获得位上结果
                    }
                }
                if(value!=0){
                    if(res[pos]>='0') res[pos]-='0';
                    res[pos]=value+'0';//最后的进位
                }
            }
            string str = res;
            reverse(str.begin(),str.end());
            return str;
        }
    };

    值得记录的是,在这个题目中将字符串数组化为string类型,一开始遗忘了,查询后发现可以直接利用string类型的构造函数传入char数组做参数或是拷贝构造直接利用复制号实现。

    然后利用了algorithm头文件中的reverse函数将string类型翻转。

      字符串相乘
     

    给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

    示例 1:

    输入: num1 = "2", num2 = "3"
    输出: "6"

    示例 2:

    输入: num1 = "123", num2 = "456"
    输出: "56088"

    说明:

    1. num1 和 num2 的长度小于110。
    2. num1 和 num2 只包含数字 0-9
    3. num1 和 num2 均不以零开头,除非是数字 0 本身。
    4. 不能使用任何标准库的大数类型(比如 BigInteger)直接将输入转换为整数来处理
    最好的开始时间是以前,其次是现在。
  • 相关阅读:
    vs 编译加速
    leetcode 1405
    sort 从大到小从小到大
    leetcode1404
    leetcode 1406
    leetcode 1556
    杭电研究生自动登录联网脚本
    Cannot mix incompatible Qt library (version ) with this library (version ) 解决方案
    目标检测算法优化技巧
    特征工程和模型融合--机器学习--思维导图和笔记
  • 原文地址:https://www.cnblogs.com/dragonsbug/p/13299654.html
Copyright © 2020-2023  润新知