• Multiply Strings大整数乘法


    [抄题]:

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

     [暴力解法]:

    时间分析:

    空间分析:

    [思维问题]:

     还要找到结果中第一位不等于0的数再添加,没想到

    [一句话思路]:

    套公式, 没有carry进位了,全都是对ans直接进行操作:

    ans[i + j] += a [i] * b[j] 

    全部相乘之后再统一进位

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 长度用l1 l2来表示,比较简单。二者合并后的新数组要为0新添加一位,变成num[l1 + l2 + 1]
    2. while循环可以加2个条件,括号里不止有一个东西,从而控制几个条件 while (i >= 1 && ans[i] == 0)
    3. 结果添加的时候,index也可以变,从而不用for就一直往后添加 result += ans[i--]

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    没有变量carry,但是有carry进位的过程:直接对ans[]进行操作

    [复杂度]:Time complexity: O(n) Space complexity: O(n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

    public class Solution {
        /**
         * @param num1: a non-negative integers
         * @param num2: a non-negative integers
         * @return: return product of num1 and num2
         */
        public String multiply(String num1, String num2) {
            //mutiply
            int l1 = num1.length();
            int l2 = num2.length();
            int[] ans = new int[l1 + l2 + 1];//add new
    
            for (int i = 0; i < l1; i++) {
                for (int j = 0; j < l2; j++) {
                    ans[i + j] += (num1.charAt(l1 - 1 - i) - '0') * 
                    (num2.charAt(l2 - 1 - j) - '0');
                }
            }
            //carry process
            for (int i = 0; i < l1 + l2; i++) {
                ans[i + 1] += ans[i] / 10;
                ans[i] = ans[i] % 10;//
            }
            //find first position
            int i = l1 + l2;
            while (i >= 1 && ans[i] == 0) {//
                i--;
            }
            //add to ans
            String result = "";
            while (i >= 0) {
                result += ans[i--]; //i should move
            }
            
            return result;
        }
    }
    View Code
  • 相关阅读:
    [一起面试AI]NO.9 如何判断函数凸或非凸
    [一起面试AI]NO.8 在机器学习中,常用的损失函数有哪些?
    [一起面试AI]NO.5过拟合、欠拟合与正则化是什么?
    [一起面试AI]NO.4特征工程主要包括什么?
    [一起面试AI]NO.3分类问题常用的性能度量指标有哪些
    MySQL中自增ID修改起始值
    折半查找算法(Python版)
    彻底解决安卓7.0及以上版本抓包https失败
    Charles抓包2-Charles抓取https请求
    Charles抓包1-Charles安装汉化(附正版注册码)
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8463470.html
Copyright © 2020-2023  润新知