• 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)直接将输入转换为整数来处理
    最好的开始时间是以前,其次是现在。
  • 相关阅读:
    微信公众平台消息接口开发之校验签名与消息响应合并
    微信公众平台开发之在网页上添加分享到朋友圈,关注微信号等按钮
    微信公众平台自定义菜单PHP开发
    所有边权均不相同的无向图最小生成树是唯一的证明
    无向带权图的最小生成树算法——Prim及Kruskal算法思路
    排序二叉树,平衡二叉树和红黑树的概念以及相关的操作讲解
    B树、B-树、B+树、B*树
    森林、树与二叉树相互转换
    普通树转换成二叉树
    哈夫曼树
  • 原文地址:https://www.cnblogs.com/dragonsbug/p/13299654.html
Copyright © 2020-2023  润新知