📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
查看: 1049| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 43. Multiply Strings P1的进位问题

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
这道题有个疑惑点,先贴看到的答案吧

public String multiply(String num1, String num2) {
        if(num1 == null || nums2 == null) return '0';
        int[] digits = new int[num1.length + num2.length];

        for(int i = num1.length - 1; i >= 0; i--) {
            for(int j = num2.length - 1; j >=0; j--) {
                int product = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                int p1 = i + j;
                int p2 = i + j + 1;
                int sum = digits[p2] + product;
                digits[p1] += sum/10;
                digits[p2] = sum%10;
            }
        }

        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < digits.length; i++) {
            if(!(digits[i] == 0 && sb.length == 0)) {
                sb.append(digits[i]);
            }
        }
        return sb.length == 0 ? '0' : sb.toString();
    }

有个情况就是如果digits[p1] 之前刚好等于9, 然后万一sum/10等于个1, 9 + 1不就等于10了嘛, 这样digits[p1]就等于10了,这难道不需要进个位嘛?

上一篇:转载:算法面试前必知必会的8种数据结构
下一篇:请求有leetcode账户的好心人截个公司分类的题目图(bytedance的)可以吗?
🔗
magicsets 2020-2-6 12:35:02 | 只看该作者
全局:
digits的中间状态可以超过9,但是for循环是从低位往高位走的,所以上一次超过9的部分在下一次循环中会进位

你在内部for循环的最后加一些输出就可以看出来过程了,比如这样:
  1. import java.util.Arrays;

  2. public class Main {
  3.   public String multiply(String num1, String num2) {
  4.     if (num1 == null || num2 == null) {
  5.       return "0";
  6.     }
  7.     int[] digits = new int[num1.length() + num2.length()];

  8.     for (int i = num1.length() - 1; i >= 0; i--) {
  9.       for (int j = num2.length() - 1; j >= 0; j--) {
  10.         int product = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
  11.         int p1 = i + j;
  12.         int p2 = i + j + 1;
  13.         int sum = digits[p2] + product;
  14.         digits[p1] += sum / 10;
  15.         digits[p2] = sum % 10;
  16.         System.out.println("i = " + i + ", j = " + j +
  17.                            ", p1 = " + p1 + ", p2 = " + p2 +
  18.                            ", digits = " + Arrays.toString(digits));
  19.         System.out.println("--");
  20.       }
  21.     }

  22.     StringBuilder sb = new StringBuilder();
  23.     for (int i = 0; i < digits.length; i++) {
  24.       if (!(digits[i] == 0 && sb.length() == 0)) {
  25.         sb.append(digits[i]);
  26.       }
  27.     }
  28.     return sb.length() == 0 ? "0" : sb.toString();
  29.   }
  30.   
  31.   public static void main(String[] args) {
  32.     System.out.println("Result = " + new Main().multiply("999", "99"));
  33.   }
  34. }
复制代码


输出:
  1. i = 2, j = 1, p1 = 3, p2 = 4, digits = [0, 0, 0, 8, 1]
  2. --
  3. i = 2, j = 0, p1 = 2, p2 = 3, digits = [0, 0, 8, 9, 1]
  4. --
  5. i = 1, j = 1, p1 = 2, p2 = 3, digits = [0, 0, 17, 0, 1]
  6. --
  7. i = 1, j = 0, p1 = 1, p2 = 2, digits = [0, 9, 8, 0, 1]
  8. --
  9. i = 0, j = 1, p1 = 1, p2 = 2, digits = [0, 17, 9, 0, 1]
  10. --
  11. i = 0, j = 0, p1 = 0, p2 = 1, digits = [9, 8, 9, 0, 1]
  12. --
  13. Result = 98901
复制代码


可以看出循环过程中digits中至多有一个slot可能>=10,但下一次那个slot就会进位

评分

参与人数 1大米 +1 收起 理由
fish1994 + 1 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
 楼主| fish1994 2020-2-6 13:30:07 | 只看该作者
全局:
magicsets 发表于 2020-2-6 12:35
digits的中间状态可以超过9,但是for循环是从低位往高位走的,所以上一次超过9的部分在下一次循环中会进位
...

秒懂了,谢谢层主!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表