• LeetCode--043--字符串相乘(java)


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

    正确方法:结合算式相乘的思想

                                               0     4

                                index      0     1    2      3      4

                                               <---[p1   p2]

    TIME:O(n*m)

    SPACE:O(n+m)

     1 class Solution {
     2     public String multiply(String num1, String num2) {
     3         if(num1 == null || num2 == null)return "0";
     4         int[] digits = new int[num1.length() + num2.length()];
     5         for(int i = num1.length() - 1;i >= 0;i--){
     6             for(int j = num2.length() - 1;j >= 0;j--){
     7                 int product = (num1.charAt(i) - '0' ) * (num2.charAt(j) - '0');
     8                 int p1 = i + j,p2 = i + j + 1;//乘完之后放在digit数组中的位置
     9                 int sum = product +digits[p2];
    10                 digits[p1] += sum / 10;
    11                 digits[p2] = sum % 10; //数组默认进行初始化为0
    12             }
    13         }
    14         StringBuilder res = new StringBuilder();
    15         //digits[0,0,1,0,3]
    16         for(int digit : digits){
    17             if(!(digit == 0 && res.length() == 0)){
    18                 res.append(digit);
    19             }
    20         }
    21         return res.length() == 0 ? "0" : res.toString();
    22     }
    23 }

    错误方法:当超出最大值时失效,改成double后,并去掉科学计数法,由于精度问题会出现结果错误

     1 class Solution {
     2     public String multiply(String num1, String num2) {
     3         long n1 = num1.charAt(num1.length()-1) - '0';
     4         long n2 = num2.charAt(num2.length()-1) - '0';
     5         num1 = new StringBuffer(num1).reverse().toString();
     6         num2 = new StringBuffer(num2).reverse().toString();
     7         System.out.println(num1);
     8         for(int i = 1;i < num1.length();i++){
     9             n1 += (num1.charAt(i) - '0') *Math.pow(10, i);
    10         }
    11         for(int i = 1;i < num2.length();i++){
    12             n2 += (num2.charAt(i) - '0') *Math.pow(10, i);
    13         }
    14         return String.valueOf(n1 * n2);
    15     }
    16 }

     17:25:54 17:26:00

  • 相关阅读:
    CAShapeLayer
    iOS开发多线程篇—NSOperation基本操作
    OS开发多线程篇—NSOperation简单介绍
    iOS开发多线程篇—GCD的常见用法
    iOS开发多线程篇—GCD的基本使用
    iOS开发多线程篇—线程的状态
    iOS开发多线程篇—线程间的通信
    iOS开发多线程篇—线程安全
    iOS开发多线程篇—创建线程
    iOS开发多线程篇—多线程简单介绍
  • 原文地址:https://www.cnblogs.com/NPC-assange/p/10802789.html
Copyright © 2020-2023  润新知