zoukankan      html  css  js  c++  java
  • 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)直接将输入转换为整数来处理
    最好的开始时间是以前,其次是现在。
  • 相关阅读:
    docker映射端口无法访问
    Tomcat日志分析
    linux服务器性能测试
    mysql库表结构对比工具
    网络基础知识,不懂看这里
    Python之redis、mysql进程守护
    linux文件查找工具
    nginx解决跨域问题
    redis插入单个较大的键值
    linux系统安全巡检脚本
  • 原文地址:https://www.cnblogs.com/dragonsbug/p/13299654.html
Copyright © 2011-2022 走看看