力扣刷题笔记 43. 字符串相乘 C#

今日签到题,签到题如下:

给定两个以字符串形式表示的非负整数 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)或直接将输入转换为整数来处理。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

之前做过字符串相加,所以首先想法是将 num1 和 num2 的字符逐个相乘得到字符串,然后把这些字符串相加,得到最终结果。

复杂度分析引用官方题解:

力扣刷题笔记 43. 字符串相乘 C#_第1张图片

以下为自己提交的代码:

public class Solution {
    public string Multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
        string result = "";
        string zero = "";
        for (int i = num1.Length - 1; i >= 0; i--)
        {
            string tempResult = "";
            int add = 0;
            for (int j = num2.Length - 1; j >= 0;j--)
            {
                add += (num1[i] - 48) * (num2[j] - 48);
                tempResult = (add % 10).ToString() + tempResult;
                add = add / 10;
            }
            if (add > 0) tempResult = add.ToString() + tempResult;
            result = Add(result,tempResult + zero);
            zero += "0";
        }
        return result;
    }

    private string Add(string num1,string num2)
    {
        int index1 = num1.Length - 1;
        int index2 = num2.Length - 1;
        int add = 0;
        string ret = "";
        while (index1 >= 0 || index2 >= 0)
        {
            add += index1 >= 0?(num1[index1] - 48):0;
            add += index2 >= 0?(num2[index2] - 48):0;
            ret = (add % 10).ToString() + ret;
            add = add / 10;
            if (index1 >= 0) index1--;
            if (index2 >= 0) index2--;
        }
        if (add > 0) ret = add.ToString() + ret;
        return ret;
    }
}

提交之后发现效率十分低下:

还是看官方题解,题解提供的另一个思路效率明显较高。该思路拆解了字符逐个相乘这一步,先把每个字符相乘的结果用整型数组 numArr 保存,其内容为结果从个位开始逆序排列。numArr 元素可能出现由于多次相加导致大于 10,没有关系,最终相加的时候也进行进位操作就可以了。

如果使用字符串相加,要反复遍历较大长度的字符串多次,本方法中避免了这种相加,大大提高效率。

复杂度分析引用官方题解:

力扣刷题笔记 43. 字符串相乘 C#_第2张图片

以下为自己提交的代码:

public class Solution {
    public string Multiply(string num1, string num2) {
        if (num1 == "0" || num2 == "0") return "0";
        int[] numArr = new int[num1.Length + num2.Length];
        for (int i = num1.Length - 1; i >= 0; i--)
        {
            int x = num1[i] - 48;
            for (int j = num2.Length - 1; j >= 0;j--)
            {
                numArr[i + j + 1] += (num2[j] - 48) * x;
            }
        }
        string result = "";
        for (int i = numArr.Length - 1; i > 0; i--)
        {
            numArr[i - 1] += numArr[i] / 10;
            result = (char)(numArr[i] % 10 + 48) + result;
        }
        if (numArr[0] != 0) result = (char)(numArr[0] % 10 + 48) + result;
        return result;
    }
}

 

你可能感兴趣的:(基础算法)