资讯专栏INFORMATION COLUMN

leetcode43 multiply strings

Batkid / 3475人阅读

摘要:题目要求将两个形式的数字相乘的结果用的形式返回。不准使用以外的形式来记录数字。假设,则将结果的十位和个位分别放在数组下标为和的位置上。存储的位置等同于上一思路。然后再通过一轮遍历将进位处理一下。

题目要求
Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2.

Note:

 1. The length of both num1 and num2 is < 110. 
 2. Both num1 and num2 contains only digits 0-9.
 3. Both num1 and num2 does not contain any
    leading zero. 
 4. You must not use any built-in BigInteger library or
    convert the inputs to integer directly.
    
    

将两个String形式的数字相乘的结果用String的形式返回。不准使用Int(java)以外的形式来记录数字。

思路一:队列

通过队列存储每一轮计算的结果。进行下一轮计算的时候,将上一轮的值deque出来加到当前的值上。

    public String multiply(String num1, String num2) {
        if(num1.equals("0") || num2.equals("0")){
            return "0";
        }
        
        StringBuilder result = new StringBuilder();
        //使用链表的方式实现队列
        LinkedList queue = new LinkedList();
        int count = 0;
        //将队尾的0添加到结果值中,并消去结尾的结果值
        if(num1.endsWith("0")){
            for(int i = num1.length() - 1 ; i>=0 ; i--){
                if(num1.charAt(i) == "0"){
                    count++;
                    result.append("0");
                }else{
                    break;
                }
            }
            num1 = num1.substring(0, num1.length()-count);
        }
        
        count = 0;
        if(num2.endsWith("0")){
            for(int i = num2.length() - 1 ; i>=0 ; i--){
                if(num2.charAt(i) == "0"){
                    count++;
                    result.append("0");
                }else{
                    break;
                }
            }
            num2 = num2.substring(0, num2.length()-count);
        }
        
        
        for(int i = num1.length()-1 ; i>=0 ; i--){    
            //乘数的值,如果乘数为0,则直接将上一轮的值添加到结果值
            int number1 = num1.charAt(i) - "0";
            if(number1 == 0){
                result.append(queue.removeFirst());
                //补进位0
                queue.add(0);
                continue;
            }
            int carry = 0;
            for(int j = num2.length()-1 ; j>=0 ; j--){
                //被乘数的值
                int number2 = num2.charAt(j) - "0";
                //第一轮无需考虑上一轮的进位
                int currentVal = number1 * number2 + carry + (i==num1.length()-1?0:queue.removeFirst());
                //如果是这一轮的末尾,直接将值添加到结果值中
                if(j== num2.length()-1){
                    result.append(currentVal % 10);
                }else{
                    queue.add(currentVal % 10);
                }
                carry = currentVal/10;
            }
            queue.add(carry);
            carry = 0;
        }
        while(!queue.isEmpty() && queue.getLast() == 0){
            queue.removeLast();
        }
        //将队列中的非零开头的进位添加到结果中
        while(!queue.isEmpty()){
            result.append(queue.removeFirst());
        }
        return result.reverse().toString();
        
    }
思路二:int数组存储

根据乘法计算的规则,我们可以判断两个值计算后应该填到哪一个位置上。假设num1[i]*num2[j],则将结果的十位和个位分别放在数组下标为i+j和i+j+1的位置上。记得计算的时候要加上上一轮的进位。

public 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"); 
            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) if(!(sb.length() == 0 && p == 0)) sb.append(p);
    return sb.length() == 0 ? "0" : sb.toString();
}

思路三:将计算和进位分开

这里将每一位的计算结果都先存储到当前位置上,不管是否进位。存储的位置等同于上一思路。然后再通过一轮遍历将进位处理一下。

    public String multiply(String num1, String num2) {
       if(num1.isEmpty() || num2.isEmpty()) return "0";
        int m = num1.length(), n = num2.length();
        int[] ret = new int[m+n];
        
        for(int i = m-1; i >= 0; i--) {
            int n1 = num1.charAt(i)-"0";
            for(int j = n-1; j>=0; j--) {
                int n2 = num2.charAt(j)-"0";
                int mul = n1*n2;
                ret[i+j+1] += mul;
            }
        }
        
        int carryOver = 0;
        for(int i = ret.length-1; i>=0; i--) {
            ret[i]+=carryOver;
            carryOver = ret[i]/10;
            ret[i]%=10;
        }
        
        StringBuilder sb = new StringBuilder();
        for(int x : ret) {
            if(x == 0 && sb.length()==0) continue;
            sb.append(x);
        }
        return sb.length()==0?"0":sb.toString();
        
    }


想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70170.html

相关文章

  • leetcode 43 Multiply Strings

    摘要:题目详情题目要求输入两个以字符串形式表示的正整数,要求我们求出它们的乘积,同样也是字符串形式表示。要求不能直接将字符串转换为整数进行乘法运算。想法这道题的思路就是将我们平时手算多位数乘法的计算方法,转换成程序语言。 题目详情 Given two non-negative integers num1 and num2 represented as strings, return the ...

    cloud 评论0 收藏0
  • 力扣(LeetCode)43

    摘要:示例输入输出示例输入输出说明和的长度小于。和均不以零开头,除非是数字本身。举例说明这两个数的乘积的长度一定不会超过,分别是字符串的长度。第一轮第二轮至此该数组变为然后再从尾部处理进位。 题目地址:https://leetcode-cn.com/probl...题目描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字...

    itvincent 评论0 收藏0
  • LeetCode43.字符串相乘 JavaScript

    摘要:给定两个以字符串形式表示的非负整数和,返回和的乘积,它们的乘积也表示为字符串形式。示例输入输出示例输入输出说明和的长度小于。和均不以零开头,除非是数字本身。不能使用任何标准库的大数类型比如或直接将输入转换为整数来处理。 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1: 输入: num1 = 2, ...

    kk_miles 评论0 收藏0
  • 43. Multiply Strings

    摘要:是最高位代表进位,表示本位。就是本位的乘积加上本位已有的值。进位就是除以的余数本位就是剩下的个位数。 43 Multiply Strings 关键词,进位。 public class Solution { public String multiply(String num1, String num2) { int m = num1.length(), n = n...

    fsmStudy 评论0 收藏0
  • leetcode399. Evaluate Division

    摘要:题目要求已知一些字母之间的关系式,问是否能够计算出其它字母之间的倍数关系如已知问是否能够计算出的值。这里的值因为在条件中无法获知是否等于零,因此也无法计算其真实结果,也需要返回。即代表点指向点的边的权重为,而点指向点的边的全中为。 题目要求 Equations are given in the format A / B = k, where A and B are variables ...

    Jensen 评论0 收藏0

发表评论

0条评论

Batkid

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<