国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[Leetcode] Multiply String and Big Interger 大數(shù)乘法加法

keithxiaoy / 3350人閱讀

摘要:因?yàn)楸怀藬?shù)每一位數(shù)字和乘數(shù)相乘的結(jié)果是依次錯(cuò)開(kāi)的,所以就沒(méi)問(wèn)題。判斷兩個(gè)數(shù)的大小的方法,是先判斷其長(zhǎng)度,如果長(zhǎng)度不一樣,則較長(zhǎng)的較大,如果長(zhǎng)度一樣,則需要比較每一位。

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.

模擬乘法 復(fù)雜度

時(shí)間 O(NM) 空間 O(N+M)

思路

這題的技巧在于復(fù)用同一個(gè)結(jié)果數(shù)組存放上次的計(jì)算結(jié)果。因?yàn)楸怀藬?shù)每一位數(shù)字和乘數(shù)相乘的結(jié)果是依次錯(cuò)開(kāi)的,所以就沒(méi)問(wèn)題。

注意

轉(zhuǎn)換回String前要先把前面的0去掉,但第一位的0不去掉

代碼
public class Solution {
    public String multiply(String num1, String num2) {
        if(num1 == null || num2 == null) return null;
        int len1 = num1.length(), len2 = num2.length();
        // 結(jié)果的位數(shù)最多可能是兩個(gè)乘數(shù)位數(shù)之和
        int len3 = len1 + len2;
        int[] res = new int[len3];
        int carry = 0, i = 0, j = 0;
        for(i = len1 - 1; i >= 0; i--){
            // 先置carry位為0
            carry = 0;
            for(j = len2 - 1; j >= 0; j--){
                // 每一位的乘積,等于之前這一位的結(jié)果,加上carry,再加上這一位和乘數(shù)的乘積
                int product = carry + res[i + j + 1] + (num1.charAt(i) - "0")*(num2.charAt(j) - "0");
                res[i + j + 1] = product % 10;
                carry = product / 10;
            }
            // 把最后的carry位加上
            res[i + j + 1] = carry;
        }
        StringBuilder resstr = new StringBuilder();
        i = 0;
        // 跳過(guò)前面無(wú)用的0
        while(i < len3 - 1 && res[i] == 0){
            i++;
        }
        for(; i < len3; i++){
            resstr.append(res[i]);
        }
        return resstr.toString();
    }
}
Add Two Strings 模擬加法 復(fù)雜度

時(shí)間 O(N) 空間 O(N)

思路

從后向前模擬加法

代碼
private String addString(String num1, String num2){
    int i = num1.length() - 1, j = num2.length() - 1;
    int k = Math.max(i, j);
    int[] num3 = new int[k + 1];
    int sum = 0, carry = 0;
    while(i >= 0 || j >= 0){
        // 加數(shù)的位
        int d1 = i >= 0 ? (num1.charAt(i) - "0") : 0; 
        // 被加數(shù)的位
        int d2 = j >= 0 ? (num2.charAt(j) - "0") : 0;
        sum = d1 + d2 + carry;
        num3[k] = sum % 10;
        carry = sum / 10;
        k--;
        i--;
        j--;
    }
    StringBuilder sb = new StringBuilder();
    // 如果最后還有進(jìn)位要加上
    if(carry != 0) sb.append(carry);
    for(int digit : num3){
        sb.append(digit);
    }
    return sb.toString();
}
有符號(hào)加法 思路

有符號(hào)的話,就要根據(jù)符合判斷具體的操作

如果都是負(fù)數(shù),則結(jié)果是兩個(gè)絕對(duì)值相加再取負(fù)

如果一個(gè)是負(fù)數(shù)一個(gè)正數(shù),則結(jié)果是(正數(shù))減去(負(fù)數(shù)的絕對(duì)值),這里要用到減法

如果都是正數(shù)則直接相加

代碼
private static String addSignedString(String num1, String num2){
    int sign1 = 1, sign2 = 1;
    if(num1.charAt(0) == "-"){
        sign1 = -1;
        num1 = num1.substring(1);
    }
    if(num2.charAt(0) == "-"){
        sign2 = -1;
        num2 = num2.substring(1);
    }
    if(sign1 == sign2){
        String res = addString(num1, num2);
        return sign1 == -1 ? "-" + res : res;
    } else {
        if(sign1 == 1){
            return subString(num1, num2);
        } else {
            return subString(num2, num1);
        }
    }
}
Substract Two Strings 模擬減法 復(fù)雜度

時(shí)間 O(N) 空間 O(N)

思路

從后向前模擬減法,計(jì)算每一位的值時(shí),用減數(shù)的位減去被減數(shù),再加上10,再減去借位,結(jié)果模上10就行了。借位則是看之前的結(jié)果是否小于10,如果小于10說(shuō)明借位了。不過(guò)要注意的是,我們要用較大的數(shù)減去較小的數(shù),如果減數(shù)反而較大,我們要用減數(shù)減去被減數(shù),然后結(jié)果加上負(fù)號(hào)。判斷兩個(gè)數(shù)的大小的方法,是先判斷其長(zhǎng)度,如果長(zhǎng)度不一樣,則較長(zhǎng)的較大,如果長(zhǎng)度一樣,則需要比較每一位。

代碼
private static String subString(String num1, String num2){
    int len1 = num1.length(), len2 = num2.length();
    // 根據(jù)兩數(shù)的大小關(guān)系,決定是直接相減,還是反過(guò)來(lái)相減取負(fù)
    if(len1 > len2){
        return coreSub(num1, num2);
    } else if (len1 < len2){
        return "-"+coreSub(num2, num1);
    } else {
        int compare = num1.compareTo(num2);
        if(compare > 0){
            return coreSub(num1, num2);
        } else if(compare < 0){
            return "-"+coreSub(num2, num1);
        } else {
            return "0";
        }
    }
}

private static String coreSub(String num1, String num2){
    int i = num1.length() - 1, j = num2.length() - 1;
    int[] num3 = new int[i + 1];
    int diff = 0, borrow = 0;
    while(i >= 0){
        int d1 = num1.charAt(i) - "0";
        int d2 = j >= 0? num2.charAt(j) - "0": 0;
        // 計(jì)算差值時(shí)要先加上10
        diff = d1 + 10 - borrow - d2;
        num3[i] = diff % 10;
        borrow = diff < 10 ? 1 : 0;
        i--;
        j--;
    }
    i = 0;
    while(num3[i] == 0){
        i++;
    }
    StringBuilder sb = new StringBuilder();
    while(i < num3.length){
        sb.append(num3[i]);
        i++;
    }
    return sb.toString();
}
有符號(hào)減法 代碼
private static String subSignedString(String num1, String num2){
    int sign1 = 1, sign2 = 1;
    if(num1.charAt(0) == "-"){
        sign1 = -1;
        num1 = num1.substring(1);
    }
    if(num2.charAt(0) == "-"){
        sign2 = -1;
        num2 = num2.substring(1);
    }
    if(sign1 == sign2){
        // 都是正數(shù)則直接相減
        if(sign1 == 1){
            return subString(num1, num2);
        // 都是負(fù)數(shù)則后面減去前面
        } else {
            return subString(num2, num1);
        }
    } else {
        // 前正后負(fù)則相加
        if(sign1 == 1){
            return addString(num1, num2);
        // 前負(fù)后正則相加后取負(fù)
        } else {
            return "-"+addString(num1, num2);
        }
    }
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/64710.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
  • leetcode43 multiply strings

    摘要:題目要求將兩個(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...

    Batkid 評(píng)論0 收藏0
  • 一個(gè)有趣的算法問(wèn)題:如何定義一個(gè)分?jǐn)?shù)類(lèi)

    摘要:一個(gè)來(lái)自于程序設(shè)計(jì)的經(jīng)典問(wèn)題。注意事項(xiàng)負(fù)數(shù)問(wèn)題。和上一點(diǎn)是一樣的問(wèn)題,要確定方式是屬于具體的對(duì)象,還是屬于一個(gè)類(lèi)。 一個(gè)來(lái)自于C++程序設(shè)計(jì)的經(jīng)典問(wèn)題。如何定義一個(gè)分?jǐn)?shù)類(lèi),實(shí)現(xiàn)分?jǐn)?shù)的約分化簡(jiǎn),分?jǐn)?shù)之間的加法、減法、乘法、除法四則運(yùn)算? 1.初見(jiàn) 剛看到這道題的時(shí)候,第一感覺(jué)是挺簡(jiǎn)單的啊,就是基本的面向?qū)ο螅x對(duì)應(yīng)的加減乘除類(lèi)就可以了啊,然而到了實(shí)現(xiàn)的時(shí)候才發(fā)現(xiàn)許多問(wèn)題是說(shuō)起來(lái)容易做起...

    BearyChat 評(píng)論0 收藏0
  • 如何在多個(gè)queue多臺(tái)server上部署Celery 以及任務(wù)狀態(tài)監(jiān)控flower

    摘要:是分布式任務(wù)隊(duì)列,能實(shí)時(shí)處理任務(wù),同時(shí)支持官方文檔工作原理如下發(fā)送給從中消費(fèi)消息,并將結(jié)果存儲(chǔ)在中本文中使用的是,使用的是現(xiàn)在有兩個(gè),分別是加法運(yùn)算和乘法運(yùn)算。假定乘法運(yùn)算的事件優(yōu)先級(jí)高事件也很多,對(duì)于加法運(yùn)算,要求每分鐘最多處理個(gè)事件。 Celery是分布式任務(wù)隊(duì)列,能實(shí)時(shí)處理任務(wù), 同時(shí)支持task scheduling. 官方文檔Celery工作原理如下: celery cli...

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

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

0條評(píng)論

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