leetcode數組匯總_LeetCode刷題實戰43:字符串相乘

算法的重要性,我就不多說了吧,想去大廠,就必須要經過基礎知識和業務邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續每天帶大家做一道算法題,題目就從LeetCode上面選 !

今天和大家聊的問題叫做?字符串相乘,我們先來看題面:

https://leetcode-cn.com/problems/multiply-strings/

Given two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.

題意

給定兩個以字符串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字符串形式。

樣例

示例 1:
輸入: num1 = "2", num2 = "3"
輸出: "6"
示例?2:
輸入: num1 = "123", num2 = "456"
輸出: "56088"

說明:
  • num1 和 num2 的長度小于110。

  • num1 和 num2 只包含數字 0-9。

  • num1 和 num2 均不以零開頭,除非是數字 0 本身。

  • 不能使用任何標準庫的大數類型(比如 BigInteger)或直接將輸入轉換為整數來處理。

解題

來源:https://www.cnblogs.com/techflow/p/12544184.html

高精度與打豎式

這就需要我們的高精度算法出場了,其實嚴格說起來高精度并不是一種算法,而是一種思想。這個思想非常樸素,我敢保證我們每一個人都學過。還記得小學的時候,我們計算多位數的乘法是怎么算的嗎?大家應該都不陌生才對,就是打豎式,like this:
c5b0949cf71a7c1864f7614b1e96f48c.png
我們人類要打豎式是因為我們只能計算一位數以內的加減乘除,超過一位的人腦不能直接計算,我們就需要用紙筆記錄下來進行計算。紙筆計算的方法很簡單,就是一位一位地計算,用每一位數字依次去計算乘法,最后再移位相加起來就得到結果了。比如在上圖的第一個例子當中,我們要計算15 * 16,我們先計算6 * 15的結果,再計算1 * 15,最后將兩個結果錯位相加,就得到了答案。我們要錯位的原因也很簡單,因為我們在計算15 * 1的時候,其實背后代表的是15 * 10。我們繼續拆分問題,當我們計算6和15相乘的時候,又是怎么計算的呢?順著這個思路,整個過程可以進一步被劃分成先計算6和5相乘,再計算6和1相乘。最后,我們把兩個較大數字的相乘拆分成了在每一位上的數字相乘。到了這里,剩下的就簡單了,也就是說我們可以把這兩個很大的數字用兩個數組來存儲,數組當中的每一位存儲數字上的一位。比如我們要計算123 * 224, 我們的第一個數組是[1, 2, 3],我們的第二個數組是[2, 2, 4]。我們仿照乘法豎式中的方法計算這兩個數組當中兩兩的乘積,并將它們拼裝成答案。
123
* 224
____________492246246
____________27552
同樣我們用數組來存儲中間和最后的結果,最后的結果就是:[2, 7, 5, 5, 2]。由于題目需要我們要返回的是字符串,所以我們還需要將數組里的內容再拼接成字符串。這種用數組來模擬數字進行加減乘除運算的方法就叫做高精度算法,相信大家也都看到了,嚴格說起來這并不是一個算法,而只是一種思想。今天的題目出的是乘法,我們利用同樣的方法也可以計算加減和除法。其中加減法非常簡單,而除法則要復雜得多,也是高精度當中最難實現的部分。這里我們不做過多的拓展,計算的方法同樣是打豎式,感興趣的同學可以自行實現。

進位和前導零

當我們理清楚了打豎式的方法之后,我們還要面臨進位和前導零的問題。進位應該很容易理解,我們需要在計算乘法的時候判斷當前位置的元素是否大于等于10,如果超過10的話,我們則需要進行進位。我們只需要將它除以10,得到的結果就是我們需要進位的值。除此之外就是前導零的問題,我們都知道除了零以外的合法數字是不允許首位出現0的,但是由于我們計算的是乘法,所以當其中某一個數為0會得到整體的結果為0,但是表示在數組當中則是多個0.舉個簡單的例子,比如123 * 0,最后得到的應該是0,但是由于我們用數組表示了乘法運算當中的每一位,并且還進行了加法計算,所以會導致出現000的結果。這種情況我們要做特殊的處理,不過這也不復雜。最后我們把上面所有的思路都整理一下,就可以得到結果了。我們來看下代碼:
class Solution:def multiply(self, num1: str, num2: str) -> str:# 將字符串轉化成數組# 翻轉數組,因為我們用第0位表示個位
arr1 = [ord(i) - ord('0') for i in num1][:: -1]
arr2 = [ord(i) - ord('0') for i in num2][:: -1]# 創建結果數組,可以證明結果的長度最多是n + m
n, m = len(arr1), len(arr2)
ret = [0for i in range(n + m + 1)]for i in range(n):for j in range(m):# 按位相乘,計算進位
ret[i + j] += arr1[i] * arr2[j]if ret[i+j] >= 10:
ret[i+j+1] += ret[i+j] // 10
ret[i+j] %= 10# 最后把數組再轉化成字符串返回# 去除前導零
result = ''.join(map(str, ret))[::-1].lstrip('0')return result if len(result) > 0else'0'
今天的題只是Medium難度,并不算困難,會選這題的原因主要是為了高精度算法。高精度算法本身并不難,也并不常用即使是在算法比賽當中也不常見。但是它給了我們一個思路,當我們要計算的數值超過計算機目前承載能力的時候,我們還有什么方法?當然這題我們也可以取巧,因為Python當中內置了大整數,當它檢測到我們的計算結果超過范圍的時候,會自動轉化成大整數來進行計算。所以這題如果我們使用Python,可以只用幾行代碼搞定:
class Solution:def multiply(self, num1: str, num2: str) -> str:
num1 = int(num1)
num2 = int(num2)return str(num1 * num2)
好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉發吧,你們的支持是我最大的動力。

上期推文:

LeetCode1-20題匯總,速度收藏!LeetCode21-40題匯總,速度收藏!LeetCode刷題實戰40:組合總和 IILeetCode刷題實戰41:缺失的第一個正數LeetCode刷題實戰42:接雨水

f910b031096490d1503240ea5db27844.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446093.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446093.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446093.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux加密框架 crypto 算法模板 HMAC模板舉例

參考鏈接 Linux加密框架中的主要數據結構(三)_家有一希的博客-CSDN博客Linux加密框架 crypto 算法模板_CHYabc123456hh的博客-CSDN博客 HMAC算法模板 hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlinhmac.c - crypto/hmac.c - Linux…

判斷非負整數是否是3的倍數_五年級數學因數與倍數知識點匯總與解題方法技巧...

在日常教學過程中,我發現孩子們和某些家長對學習數學的方法有一些誤區,就是覺著數學,單純就是邏輯思維,只要多做練習題就能學好,但是不是這樣的,低年級的學生,學習數學還是以背誦為主&#xff0…

tcp通訊一次最多能發送多少數據?_關于TCP/IP,必須知道的十個知識點

本文整理了一些TCP/IP協議簇中需要必知必會的十大問題,既是面試高頻問題,又是程序員必備基礎素養。一、TCP/IP模型TCP/IP協議模型(Transmission Control Protocol/Internet Protocol),包含了一系列構成互聯網基礎的網絡…

Linux內核crypto子系統的調用邏輯

testmgr.c - crypto/testmgr.c - Linux source code (v5.15.11) - Bootlin上述代碼是內核內部即crypto子系統對外提供密碼服務的測試程序調用流程&#xff1a;crypto API <—> crypto core <—> crypto_register_alg處于用戶態的程序想要調用處于內核態的密碼算法&…

python成語填空_python定期循環成語?

我有一個工作單位我希望每N秒發生一次.如果我使用簡單化minute 60while True:doSomeWork()time.sleep(minute)取決于doSomeWork()花費的時間,實際循環周期將是一分鐘加上那個時間.如果doSomeWork()所花費的時間不是確定性的,則工作周期更加難以預測.我想做的就是這樣minute 6…

Linux加密框架 crypto算法模板 以及CBC算法模板實例

參考鏈接 Linux加密框架中的主要數據結構&#xff08;四&#xff09;_家有一希的博客-CSDN博客algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin struct crypto_instance {struct crypto_alg alg;struct crypto_template *tmpl;union {/* Node i…

tomcat temp 大量 upload 文件_滲透測試之文件上傳漏洞總結

文末下載上傳環境源碼客戶端js檢查一般都是在網頁上寫一段javascript腳本&#xff0c;校驗上傳文件的后綴名&#xff0c;有白名單形式也有黑名單形式。查看源代碼可以看到有如下代碼對上傳文件類型進行了限制&#xff1a;我們可以看到對上傳文件類型進行了限制。繞過方法1.我們…

Linux加密框架 crypto算法模板 以及HMAC算法模板實例

HMAC算法模板實例 HMAC算法模板的創建實例的接口是hmac_create函數hmac.c - crypto/hmac.c - Linux source code (v5.15.11) - Bootlin hmac_create輸入的參數包括 算法模板 tmpl 和 算法模板實例參數 tbhmac_cretae函數返回的結果為0表示算法模板實例已經創建注冊算法模…

python判斷密碼強度并輸出_密碼強度判斷

[python]代碼庫def pdsz(cd):nnnn Falsefor c in cd:if c.isnumeric():nnnn Truebreakreturn nnnndef pdzm(cd):nnnn Falsefor c in cd:if c.isupper():nnnn Truebreakreturn nnnndef pdhh(cd):nnnn Falsefor c in cd:if c.islower():nnnn Truebreakreturn nnnndef main(…

linux加密框架 crypto 算法crypto_register_alg的注冊流程

算法注冊流程 靜態算法模塊初始化 分組算法模塊初始化 AES算法模塊&#xff08;aes_generic.c&#xff09;的初始化接口aes_init實現向加密框架注冊AES算法的功能&#xff0c;如下所示。aes_generic.c - crypto/aes_generic.c - Linux source code (v5.15.12) - Bootlin sta…

python 方法的實例_python調用自定義函數的實例操作

在python中&#xff0c;想要調用自定義函數必須先聲明&#xff0c;然后才能調用。使用函數時&#xff0c;只要按照函數定義的形式&#xff0c;向函數傳遞必需的參數&#xff0c;就可以調用函數完成相應的功能或者獲得函數返回的處理結果。(1)聲明函數python中使用 def 可以聲明…

linux加密框架 crypto 靜態哈希算法crypto_register_shash注冊流程

參考鏈接 Linux加密框架的算法管理&#xff08;一&#xff09;_家有一希的博客-CSDN博客_linux加密框架設計與實現shash.c - crypto/shash.c - Linux source code (v5.15.12) - Bootlin 函數介紹 crypto_register_shash函數實現向加密框架注冊靜態哈希算法的功能&#xff0c;…

多個線程訪問統一對象的不同方法_C#多線程讀寫同一文件處理

在多線程訪問讀寫同一個文件時&#xff0c;經常遇到異常&#xff1a;“文件正在由另一進程使用&#xff0c;因此該進程無法訪問此文件”。多線程訪問統一資源的異常&#xff0c;解決方案1&#xff0c;保證讀寫操作單線程執行&#xff0c;可以使用lock解決方案2&#xff0c;使用…

linux加密框架 crypto 通用算法注冊接口__crypto_register_alg注冊流程

函數介紹 __crypto_register_alg函數實現向加密框架注冊算法&#xff08;包括靜態算法和動態算法&#xff09;的功能&#xff0c;輸入參數為算法說明alg&#xff0c;注冊成功時返回算法注冊用的算法幼蟲larval&#xff0c;注冊失敗時返回失敗原因。__crypto_register_alg函數執…

spark官方文檔_Spark整合Ray思路漫談

什么是Ray之前花了大概兩到三天把Ray相關的論文&#xff0c;官網文檔看了一遍&#xff0c;同時特意去找了一些中文資料看Ray當前在國內的發展情況(以及目前國內大部分人對Ray的認知程度)。先來簡單介紹下我對Ray的認知。首先基因很重要&#xff0c;所以我們先需要探查下Ray最初…

python用http協議傳數據_python基礎 -- 簡單實現HTTP協議

標簽&#xff1a;一、直接代碼# -*- coding: utf-8 -*-import socket__author__ ‘lpe234‘__date__ ‘2015-03-12‘if __name__ ‘__main__‘:sock socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind((‘127.0.0.1‘, 8001))sock.listen(5)while True:connecti…

linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg

算法查找接口crypto_find_alg 算法實例tfm是算法的一個可運行的副本&#xff0c;因此在創建算法實例前首先要查找確認算法是否已經注冊有效&#xff0c;此時算法查找由函數crypto_find_alg實現。補充&#xff1a; struct crypto_tfm *tfm; crypto_tfm類型指針tfm可以理解為指代…

linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_mod_lookup

參考鏈接 Linux加密框架的算法管理&#xff08;二&#xff09;_家有一希的博客-CSDN博客linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的博客-CSDN博客 函數介紹 crypto_alg_mod_lookup函數輸入參數包括待查找的算法名name、算法類型type和算…

qt triggered信號_Qt之網絡編程UDP通信

點擊上方“Qt學視覺”&#xff0c;選擇“星標”公眾號重磅干貨&#xff0c;第一時間送達想要學習的同學們還請認真閱讀每篇文章&#xff0c;相信你一定會有所收獲UDP通信概述UDP(UserDatagramProtocol&#xff0c;用戶數據報協議)是輕量的、不可靠的、面向數據報(datagram)、無…

adguard沒有核心 core no_面試官:線程池如何按照core、max、queue的執行順序去執行?...

前言這是一個真實的面試題。前幾天一個朋友在群里分享了他剛剛面試候選者時問的問題&#xff1a;"線程池如何按照core、max、queue的執行循序去執行&#xff1f;"。我們都知道線程池中代碼執行順序是&#xff1a;corePool->workQueue->maxPool&#xff0c;源碼…