1. 程式人生 > >LeetCode011:字串相乘

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/前端等學習資源!

極簡XksA