成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

leetcode43 multiply strings

Batkid / 3562人閱讀

摘要:題目要求將兩個(gè)形式的數(shù)字相乘的結(jié)果用的形式返回。不準(zhǔn)使用以外的形式來(lái)記錄數(shù)字。假設(shè),則將結(jié)果的十位和個(gè)位分別放在數(shù)組下標(biāo)為和的位置上。存儲(chǔ)的位置等同于上一思路。然后再通過(guò)一輪遍歷將進(jìn)位處理一下。

題目要求
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.
    
    

將兩個(gè)String形式的數(shù)字相乘的結(jié)果用String的形式返回。不準(zhǔn)使用Int(java)以外的形式來(lái)記錄數(shù)字。

思路一:隊(duì)列

通過(guò)隊(duì)列存儲(chǔ)每一輪計(jì)算的結(jié)果。進(jìn)行下一輪計(jì)算的時(shí)候,將上一輪的值deque出來(lái)加到當(dāng)前的值上。

    public String multiply(String num1, String num2) {
        if(num1.equals("0") || num2.equals("0")){
            return "0";
        }
        
        StringBuilder result = new StringBuilder();
        //使用鏈表的方式實(shí)現(xiàn)隊(duì)列
        LinkedList queue = new LinkedList();
        int count = 0;
        //將隊(duì)尾的0添加到結(jié)果值中,并消去結(jié)尾的結(jié)果值
        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--){    
            //乘數(shù)的值,如果乘數(shù)為0,則直接將上一輪的值添加到結(jié)果值
            int number1 = num1.charAt(i) - "0";
            if(number1 == 0){
                result.append(queue.removeFirst());
                //補(bǔ)進(jìn)位0
                queue.add(0);
                continue;
            }
            int carry = 0;
            for(int j = num2.length()-1 ; j>=0 ; j--){
                //被乘數(shù)的值
                int number2 = num2.charAt(j) - "0";
                //第一輪無(wú)需考慮上一輪的進(jìn)位
                int currentVal = number1 * number2 + carry + (i==num1.length()-1?0:queue.removeFirst());
                //如果是這一輪的末尾,直接將值添加到結(jié)果值中
                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();
        }
        //將隊(duì)列中的非零開(kāi)頭的進(jìn)位添加到結(jié)果中
        while(!queue.isEmpty()){
            result.append(queue.removeFirst());
        }
        return result.reverse().toString();
        
    }
思路二:int數(shù)組存儲(chǔ)

根據(jù)乘法計(jì)算的規(guī)則,我們可以判斷兩個(gè)值計(jì)算后應(yīng)該填到哪一個(gè)位置上。假設(shè)num1[i]*num2[j],則將結(jié)果的十位和個(gè)位分別放在數(shù)組下標(biāo)為i+j和i+j+1的位置上。記得計(jì)算的時(shí)候要加上上一輪的進(jìn)位。

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();
}

思路三:將計(jì)算和進(jìn)位分開(kāi)

這里將每一位的計(jì)算結(jié)果都先存儲(chǔ)到當(dāng)前位置上,不管是否進(jìn)位。存儲(chǔ)的位置等同于上一思路。然后再通過(guò)一輪遍歷將進(jìn)位處理一下。

    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();
        
    }


想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/70170.html

相關(guān)文章

  • leetcode 43 Multiply Strings

    摘要:題目詳情題目要求輸入兩個(gè)以字符串形式表示的正整數(shù),要求我們求出它們的乘積,同樣也是字符串形式表示。要求不能直接將字符串轉(zhuǎn)換為整數(shù)進(jìn)行乘法運(yùn)算。想法這道題的思路就是將我們平時(shí)手算多位數(shù)乘法的計(jì)算方法,轉(zhuǎn)換成程序語(yǔ)言。 題目詳情 Given two non-negative integers num1 and num2 represented as strings, return the ...

    cloud 評(píng)論0 收藏0
  • 力扣(LeetCode)43

    摘要:示例輸入輸出示例輸入輸出說(shuō)明和的長(zhǎng)度小于。和均不以零開(kāi)頭,除非是數(shù)字本身。舉例說(shuō)明這兩個(gè)數(shù)的乘積的長(zhǎng)度一定不會(huì)超過(guò),分別是字符串的長(zhǎng)度。第一輪第二輪至此該數(shù)組變?yōu)槿缓笤購(gòu)奈膊刻幚磉M(jìn)位。 題目地址:https://leetcode-cn.com/probl...題目描述:給定兩個(gè)以字符串形式表示的非負(fù)整數(shù) num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字...

    itvincent 評(píng)論0 收藏0
  • LeetCode43.字符串相乘 JavaScript

    摘要:給定兩個(gè)以字符串形式表示的非負(fù)整數(shù)和,返回和的乘積,它們的乘積也表示為字符串形式。示例輸入輸出示例輸入輸出說(shuō)明和的長(zhǎng)度小于。和均不以零開(kāi)頭,除非是數(shù)字本身。不能使用任何標(biāo)準(zhǔn)庫(kù)的大數(shù)類型比如或直接將輸入轉(zhuǎn)換為整數(shù)來(lái)處理。 給定兩個(gè)以字符串形式表示的非負(fù)整數(shù) num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。示例 1: 輸入: num1 = 2, ...

    kk_miles 評(píng)論0 收藏0
  • 43. Multiply Strings

    摘要:是最高位代表進(jìn)位,表示本位。就是本位的乘積加上本位已有的值。進(jìn)位就是除以的余數(shù)本位就是剩下的個(gè)位數(shù)。 43 Multiply Strings 關(guān)鍵詞,進(jìn)位。 public class Solution { public String multiply(String num1, String num2) { int m = num1.length(), n = n...

    fsmStudy 評(píng)論0 收藏0
  • leetcode399. Evaluate Division

    摘要:題目要求已知一些字母之間的關(guān)系式,問(wèn)是否能夠計(jì)算出其它字母之間的倍數(shù)關(guān)系如已知問(wèn)是否能夠計(jì)算出的值。這里的值因?yàn)樵跅l件中無(wú)法獲知是否等于零,因此也無(wú)法計(jì)算其真實(shí)結(jié)果,也需要返回。即代表點(diǎn)指向點(diǎn)的邊的權(quán)重為,而點(diǎn)指向點(diǎn)的邊的全中為。 題目要求 Equations are given in the format A / B = k, where A and B are variables ...

    Jensen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Batkid

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<