LeetCode011:字串相乘
一、寫在前面
LeetCode 第二題兩數之和傳輸門:LeetCode010 : 盛最多水的容器
今天給大家分享的是LeetCode 陣列與字串 第十一題:字串相乘,為面試而生,期待你的加入。
二、今日題目
給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。
說明:
(1) num1 和 num2 的長度小於110。
(2) num1 和 num2 只包含數字 0-9。
(3)num1 和 num2 均不以零開頭,除非是數字 0 本身。
(4) 不能使用任何標準庫的大數型別(比如 BigInteger)或直接將輸入轉換為整數來處理。
示例:
輸入: num1 = "2", num2 = "3"
輸出: "6"
輸入: num1 = "123", num2 = "456"
輸出: "56088"
三、 分析
我第一眼看到題就想,怎麼這麼簡單啊,把str資料int一下,然後做資料乘法運算,再把結果str一下轉換成字串不就好了嗎?然後我遇上了這句話“Use the utility in the API is recommended in the project. But if you use it in an interview, you will definitely fail .”,當然我英語不好,也能勉強看懂,直白翻譯就是“你這麼想你就不可能找到工作”,的確,我們必須認識到,我們現在實在刷演算法題,提升思維能力,不是讓我們投機取巧來了,我好好一想,包括之前的sort排序我們都不該用,或者說我們至少得知道一些基本排序演算法後,才能用,不然,整天調包,調庫,調方法,最終只會讓大家把一切都掉光。
正確思想的思路分析:
四、解題
- 捷徑的方法:
調包調包調包
class Solution(object):
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
# str->int
num1 = int(num1)
num2 = int(num2)
# 求積
result = num1*num2
# int->str,返回
return str(result)
- 提交結果
測試資料:311組
執行時間:28ms
擊敗人百分比:98.89%
這應該是最好情況
- 正確思想
時間複雜度:O(n^2)
class Solution(object):
def multiply(self, num1, num2):
"""
:type num1: str
:type num2: str
:rtype: str
"""
# 設定儲存列表(原理見思路分析)
product = [0] * (len(num1) + len(num2))
# 下標
pos = len(product) - 1
# 字串逆轉,方便從個位開始遍歷
num1 = num1[::-1]
num2 = num2[::-1]
# 遍歷被乘數字符串
for n1 in num1:
# 資料儲存位置(數量級,第一次個位相乘,最後一位,第二次十位相乘,倒數第二位...)
tempPos = pos
# 遍歷乘數字符串
for n2 in num2:
# 單個數據相乘
product[tempPos] += int(n1) * int(n2)
# 取十位及以上量級
product[tempPos - 1] += product[tempPos] // 10
# 取個位
product[tempPos] %= 10
# 前移
tempPos -= 1
# 前移,增加數量級
pos -= 1
# 找到結果列表非零數
pt = 0
while pt < len(product) - 1 and product[pt] == 0:
pt += 1
# 切片取出資料
res_list = product[pt:]
# map轉換成迭代物件,用jion函式連線返回
return ''.join(map(str,res_list))
- 提交結果
測試資料:311組
執行時間:308ms
擊敗人百分比:28.81%
雖然beat的人不多,但我有想法,我驕傲啊~
五、疑惑
其實這個題我想的是有兩個方面:
1.考察對字串的操作處理;
2.考察對資料執行的操作處理。
上面的演算法基本包括了,也是LeetCode英文網站比較推崇的一種方法。
六、結語
堅持 and 努力 : 終有所獲。
歡迎大家關注微信公眾號:極簡XksA,獲取Python/Java/前端等學習資源!