• 【每日一题】43. 字符串相乘


    43. 字符串相乘 - 力扣(LeetCode)

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

    注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

    示例 1:

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

    示例 2:

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

    提示:

    • 1 <= num1.length, num2.length <= 200
    • num1 和 num2 只能由数字组成。
    • num1 和 num2 都不包含任何前导零,除了数字0本身。

     

    1. class Solution {
    2. public String multiply(String num1, String num2) {
    3. int flag = 0;
    4. int len1 = num1.length();
    5. int len2 = num2.length();
    6. StringBuilder str = new StringBuilder(len1+len2);
    7. init(str,len1+len2);
    8. for(int i = len1 - 1;i >= 0 ; i--) {
    9. int tmpi = num1.charAt(i) - '0';
    10. int j = 0;
    11. for(j = len2 - 1; j >= 0 ; j--) {
    12. int index = (len1-i-1)+(len2-1-j);
    13. int tmp = str.charAt(index) - '0';
    14. int tmpj = num2.charAt(j) - '0';
    15. tmp = tmp + tmpi*tmpj + flag;
    16. flag = tmp/10;
    17. tmp %= 10;
    18. str.setCharAt(index,(char)(tmp+'0'));
    19. }
    20. while(flag >= 1) {
    21. int index = (len1-1-i)+(len2-1-j);
    22. int tmp = str.charAt(index) - '0';
    23. tmp = tmp+flag;
    24. flag = tmp/10;
    25. tmp%=10;
    26. str.setCharAt(index,(char)(tmp+'0'));
    27. j--;
    28. }
    29. }
    30. int len = len1+len2-1;
    31. while(str.charAt(len) == '0') {
    32. if(len == 0) break;
    33. str.delete(len,len+1);
    34. len--;
    35. }
    36. str.reverse();
    37. return str.toString();
    38. }
    39. public void init(StringBuilder str,int len) {
    40. for(int i = 0; i < len ; i++) {
    41. str.append(0);
    42. }
    43. }
    44. }

            今天是一道中等题。这道题是有关于字符串的,实际上跟大数乘法的方法相类似。如果能够搞懂这道题,那么大数乘法,大数加法应该就都没有问题了。

            读完题目,发现这道题要求我们对两个字符串进行相乘的操作。题目要求不能直接将给的字符串转成数字。所以,需要使用大数乘法。相加,是处理运算完数字放的位置,以及有无进位问题。而乘法,则是在加法的基础上多加一个两个数的乘数而已。

            第一个难点:位置。运算完的数字,应该放在哪个位置?我们需要先了解一下乘法。i位数乘j位数。第0位乘第0位放在第0位,第0位乘第1位放在第1位,第1位乘第1位放在第2位。(这里认为数字最低位是第0位),那么,发现了吗?乘法:i位*j位是放在i*j位上的。

            第二个难点:进位问题。如果是加法,那么产生的进位不会超过1。但是,乘法有可能产生1-9的进位,所以在判定是否进位时,需要使用>=1来判断,不再是==1来判断。

            那么,整体就出来了。i位数*j位数,最多产生i+j位的数,我们创建i+j位的StringBuild用来放结果。flag 用于记录是否有进位。进入循环后,每位相乘,index计算运算完的数字应该放在哪个位置。而%10操作可以判断进完位的余数,/10的操作可以判断进位的个数。最后如果有超过两数位数的进位,就单独处理。由于使用append,所以结果相反,返回之前需要reverse()一下。

            如果有其他解法,也可以发在评论区。

  • 相关阅读:
    华北工控EMB3581 瑞芯微Rockchip RK3568,python部署rknn_toolkit_lite2
    华为OD机试真题- 非严格递增连续数字序列-2023年OD统一考试(B卷)
    Figma数值输入框支持拖拽调整功能实现
    crlfuzz&crlfsuite
    Spring整合MyBatis
    Pytest参数详解 — 基于命令行模式
    Java项目:药品商城系统(java+SSM+JSP+jQuery+Mysql)
    C++ Reference: Standard C++ Library reference: C Library: cctype: toupper
    自动驾驶架构
    【C++基础】类与对象(中):默认成员函数、构造函数、析构函数、拷贝构造、赋值重载函数……
  • 原文地址:https://blog.csdn.net/C_Ryson/article/details/132781759