• LeetCode:43. Multiply Strings (Medium)


    1. 原题链接

    https://leetcode.com/problems/multiply-strings/description/

    2. 题目要求

    给定两个String类型的正整数num1、num2,返回它们的String类型乘积

    (1)num1和num2的长度都小于110;

    (2)num1、num2都只包含0-9之间的字符;

    (3)num1、num2的首位都不为0;

    (4)不能使用BigInteger,也不能字符串转直接换成整数类型

    3. 解题思路

    首先题目要求不能直接将String转换成Integer,但我们可以利用“char-'0'”的方式将其强制转换成int类型,然后进行相乘。

    例如下图中,num1=“123”,num2=“45”,首先创建一个整型数组num[ ]来保存每一位的结果,两数相乘的乘积长度肯定不超过这两个数的长度之和。这里的每一位指个、十、百、千...

    使用两层for循环分别对两个字符串num1和num2进行遍历。

    第一次遍历,num1.charAt(i) 得到‘3’,num2.charAt(j) 得到‘5’。使用num1.charAt(i) -'0'将char类型的‘3’转换成int类型的3,对num2进行同样的操作,用mul保存二者乘积。

    然后用数组num[ ]来保存每一位的结果,指针p1=i+j、p2=i+j+1分别指向数组中两个连续的位置。此时p2位于数组的最后一位,保存个位上的数字。p1是数组的倒数第二位,保存十位上的数字。

    在此之前,我们要确定个位、十位上的数字。sum保存两个数的乘积mul+个位上原有的数字(个位上原有数字为0),对sum整除10得到十位上的数字,sum对10取模得到个位上的数字。

     两层for循环完成后,最终的num[ ]数组里就保存了二者乘积的每一位上的结果

    然后将数组的元素取出来,转换成String类型,就得到了最终的结果

    4.代码实现

    public class MultiplyStrings43 {
    
        public static void main(String[] args) {
            String num2 = "12345465656565";
            String num1 = "4556";
            System.out.println(multiply(num1, num2));
    
        }
    
        public static String multiply(String num1, String num2) {
            int m = num1.length(), n = num2.length();
            int[] pos = new int[m + n]; // 用数组来保存不同位上的结果
    
            for (int i = m - 1; i >= 0; i--) {
                for (int j = n - 1; j >= 0; j--) {
                    int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');  //-'0'强制转换成int类型
                    int p1 = i + j, p2 = i + j + 1;
                    int sum = mul + pos[p2];
    
                    pos[p1] += sum / 10;
                    pos[p2] = (sum) % 10;
                }
            }
    
            StringBuilder sb = new StringBuilder();
            for (int p : pos) {  // 将最后的乘积数组转换成String类型
                if (!(sb.length() == 0 && p == 0)) sb.append(p);
            }
            return sb.length() == 0 ? "0" : sb.toString();
        }
    }
    

      

  • 相关阅读:
    【解题报告】洛谷P3959 宝藏
    【游记】CSP-S2021 退役记
    【全程NOIP计划】初赛
    【解题报告】luoguP2158 仪仗队
    mysql的索引
    Set集合的所有方法
    字符串数组String[]转换成Long类型数组Long[]
    查询记录时排序问题updateTime和createTime
    VUE中== 与 ===的区别以及!=与!==的区别
    Django 模型(ORM)
  • 原文地址:https://www.cnblogs.com/huiAlex/p/8315518.html
Copyright © 2020-2023  润新知