首先是 1480. Running Sum of 1d Array (easy)
https://leetcode.com/problems/running-sum-of-1d-array/
他會給予一個串列nums,計算出前綴和~
恩恩,標準練手用的基礎題目。
想法上就很簡單
class Solution:
def runningSum(self, nums: List[int]) -> List[int]:
ans = [nums[0]]
c = 0
for i in nums[1:]:
ans.append(ans[c]+i)
c+=1
return ans
但後來思考一下,其實不需要這麼麻煩,可以直接家回原串列就好,因此就改成下面這樣
class Solution:
def runningSum(self, nums: List[int]) -> List[int]:
for i in range(1,len(nums)):
nums[i] += nums[i-1]
return nums
下一題 724. Find Pivot Index (easy)
https://leetcode.com/problems/find-pivot-index
這題也是在講前綴和,不過相較而言比較難了。
題目會給一個串列nums,要從nums裡面找到一個索引值,能夠讓串列左邊和與串列右邊和相等(不含該索引值的值)。
想法:
class Solution:
#直接做出前綴和,然後慢慢比較
def pivotIndex(self, prefix: List[int]) -> int:
for i in range(1,len(prefix)):
prefix[i] += prefix[i-1]
prefix = [0] + prefix
for i in range(len(prefix)-1):
if prefix[i] == prefix[-1] - prefix[i+1]:
return i
if prefix[-2] == 0:
return len(prefix)
return -1
寫完這個之後,我就想試著寫個白癡方法,但沒意外TLE
class Solution:
#白癡寫法,TLE
def pivotIndex(self, nums: List[int]) -> int:
numsL = len(nums)
L,R = 0,0
for i in range(numsL):
L = sum(nums[:i])
R = 0 if i+1 == numsL else sum(nums[i+1:])
if L == R:
return i
return -1
不過也因此想到一個應該是更快的方法,可以少迭代一次
直接算出總和,慢慢用扣的就可以得到答案了。
class Solution:
#但老實說,可以只做一層for迴圈即可
def pivotIndex(self, nums: List[int]) -> int:
L,R = 0, sum(nums)
for i in range(len(nums)):
R -= nums[i]
if L == R:
return i
L += nums[i]
return -1
下一題 205. Isomorphic Strings (easy)
https://leetcode.com/problems/isomorphic-strings/
這題個人覺得有點小麻煩。
簡單來說有兩個字串s跟t,是否有辦法用相同的規律將s裡的字母替換成t(例如:egg可以換成add)。
那我看到的第一個反應就是用dict解決吧
class Solution:
#利用dict的特性s的值當key,t的值當val
#最後要檢查一次val裡的值有沒有重複的
def isIsomorphic(self, s: str, t: str) -> bool:
a = {}
if len(s) != len(t):
return 0
for i in range(len(s)):
if s[i] not in a:
a[s[i]] = t[i]
else:
if a[s[i]] != t[i]:
return 0
if len(set(a.values())) != len(a):
return 0
return 1
下一題 392. Is Subsequence (easy)
https://leetcode.com/problems/is-subsequence
給予兩個字串s,t,s是否為t的子序列(順序一樣即可)
想法,由於順序要一樣,因此比較過的字母的前面就不需要做比較:
我一開始想複雜了,也有可能是半夜想睡覺了,寫出這個鬼東西
class Solution:
#題目看清楚,他只要s是t的Subsequence(中間可以刪除一些東西)即可
#一開始想太複雜,忘了說可以用切好的東西代替原本的變數內容
def isSubsequence(self, s: str, t: str) -> bool:
s,t = list(s),list(t)
index = 0
for i in range(len(s)):
if s[i] in t[index:]:
temp = t[index:].index(s[i])
else:
return 0
# print(temp)
index += temp
t[index] = 0
return 1
但老實說越看越不對勁,為什麼,我不直接切掉就好....因此稍微改了一下。
class Solution:
#題目看清楚,他只要s是t的Subsequence(中間可以刪除一些東西)即可
#一開始想太複雜,忘了說可以用切好的東西代替原本的變數內容
#正常寫法
def isSubsequence(self, s: str, t: str) -> bool:
for i in s:
temp = t.find(i)
if temp != -1:
t = t[temp+1:]
else:
return 0
return 1
簡潔滿多的,但後來稍微看了一下其他人的寫法,看到以下寫法。
class Solution:
#題目看清楚,他只要s是t的Subsequence(中間可以刪除一些東西)即可
#一開始想太複雜,忘了說可以用切好的東西代替原本的變數內容
#指標
def isSubsequence(self, s: str, t: str) -> bool:
sL,j = len(s),0
for i in range(len(t)):
if j<sL and t[i]==s[j]:
i+=1
j+=1
return j==sL
直接利用兩個變數去進行對齊的動作即可,相較而言速度快了許多,畢竟原方法還要切來切去根本浪費效能。
以上就是這次練習到的題目,多謝指教