zoukankan      html  css  js  c++  java
  • leetcode-Multiply Strings

    Given two numbers represented as strings, return multiplication of the numbers as a string.

    Note:

      • The numbers can be arbitrarily large and are non-negative.
      • Converting the input string to integer is NOT allowed.
      • You should NOT use internal library such as BigInteger.

    解析:主要是数组位置和乘法位置的关系图:

    Multiplication

    代码解析:package leetcode;

    /*
     * 题目主要考察字符串的乘法运算!!!
     * 关键步骤:
     * 1、找好每一步乘法结果与结果数组(pos[])对应起来。每一次只在pos数组中进行运算!!!这样就涉及到两个char[]和一个int[]!!!
     * 2、每一步乘法的结果应该加上以前的进位!!那么变量有:进位变量pos[p2],当前存储乘法结果的变量cures,然后将这个结果拆分成十位+个位,存在pos两个位置里,然后循环的时候,同时往前走一步,p2 ->p1位置。
     * 3、最后构造String的时候使用StringBuilder,主要是用来判断第一个数是否为0!!
     */
    public class MultiplyStrings {

        public static String multiply(String num1, String num2) {
            char[] ch1 = num1.toCharArray();
            char[] ch2 = num2.toCharArray();
            int len1 = num1.length();
            int len2 = num2.length();
            int[] pos = new int[len1 + len2];

            for (int j = len2 - 1; j >= 0; j--)
                for (int i = len1 - 1; i >= 0; i--) {
                    int cures = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                    // 下标是往前运动的
                    int p1 = i + j, p2 = i + j + 1;
                    // 每一步的运算的子结果,为什么是p2?
                    // 因为:这里的p2就是下一个循环的p1,而p1指向更前的位置
                    // 在下一个循环加进位!!!!!!
                    int sum = cures + pos[p2];

                    // 对每个相邻的位进行运算
                    pos[p1] += sum / 10;
                    // 存储后面那一位(不再变化),前面的位很有可能向前进位,所有要+=
                    pos[p2] = sum % 10;
                }
            // 这一步:array->string,有很多方法,其实底层都是构造string;
            StringBuilder sb = new StringBuilder();
            for (int p : pos)
                // 判断一下,当头为0时,就不用添加;
                if (!(sb.length() == 0 && p == 0))
                    sb.append(p);
            return sb.length() == 0 ? "0" : sb.toString();
        }

        public static void main(String[] args) {
            System.out.println(multiply("10", "11"));
        }
    }

  • 相关阅读:
    编译内核时出现drivers/mfd/mxchdmicore.c:36:24: fatal error: mach/clock.h: No such file or directory
    IE中iframe标签显示在DIV之上的问题解决方案
    Linux驱动学习1.hello world;
    Maven安装与配置(转)
    Jmeter阶梯式压测
    Jmeter的分布式测试
    adb connect命令连接多个Android设备
    Linux当中文件的显示命令
    软件测试流程
    测试时间不够,该怎么办?
  • 原文地址:https://www.cnblogs.com/neversayno/p/5434690.html
Copyright © 2011-2022 走看看