今天開始刷leetcode上面的演算法題。我會更新我刷題過程中提交的**(成功和不成功的都有)和比較好的解法
題目的意思:輸入兩個鍊錶,這兩個鍊錶都是倒序的數字,相加後返回倒序的鍊錶。比如:
input: (2 -> 4 -> 3) + (5 -> 6 -> 4)
output: 7 -> 0 -> 8
(342 + 465 = 807)
我的解法:
思路很簡單,把兩個鍊錶分別轉換成數字,相加後把結果再轉換成鍊錶
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution:
# @param l1
# @param l2
# @return
def addtwonumbers(self, l1, l2): #以上是leetcode給與的部分,下面開始編碼
#分別把l1、l2轉成正序的字串
a=str(l1.val)
b=str(l2.val)
while l1.next != none:
a += str(l1.next.val)
l1 = l1.next
a = a[::-1]
while l2.next != none:
b += str(l2.next.val)
l2 = l2.next
b = b[::-1]
#獲得兩個數相加的值
c = int(a) + int(b)
#把c轉換成逆序鍊錶
li = listnode(c%10) #頭結點
if c//10 < 1: #當c只是一位數的時候
return li
#c為多位數,思路是對c/10求餘數,把餘數放在節點的值中,連線各節點
c = c//10
tem = li
while c//10 >= 1:
t = listnode(c%10)
tem.next = t
tem = t
c = c//10
#把最後一位放入節點
t = listnode(c)
tem.next = t
return li
以上是我的解法,雖然通過了測試,但是執行的時間有193ms,在python中算比較慢的了...
所以我去網上找了更好的解法:
# definition for singly-linked list.
# class listnode:
# def __init__(self, x):
# self.val = x
# self.next = none
class solution:
# @return a listnode
def addtwonumbers(self, l1, l2): #以上是leetcode給與的部分,下面開始編碼
dummy, flag = listnode(0), 0
head = dummy #dummy是頭結點,無意義
while flag or l1 or l2:
node = listnode(flag)
if l1:
node.val += l1.val
l1 = l1.next
if l2:
node.val += l2.val
l2 = l2.next
flag = node.val / 10 #注意這個flag,在下一次新建節點的時候會把flag的值給該節點
node.val %= 10
head.next = node
head = head.next # head.next, head = node, node
return dummy.next
題目的意思:給乙個字串,找出這個字串中沒有重複元素的最大子字串,返回這個子字串的長度
我的解法:
我的思路是新建乙個字串(tem),依次從給予的字串中讀字元,如果tem沒有該字元,則把該字元插入tem中,如果有該字元,則在tem中找出上次出現這個字元的位置post,並刪除(0,post)的所有字元,然後把該字元插入tem,同時我新建了count
和maxnum
變數,用來記錄最長子字串的長度,返回maxnum
class solution:
# @param s
# @return
def lengthoflongestsubstring(self, s): #以上是leetcode給與的部分,下面開始編碼
tem = ''
count = 0
maxnum = 0
for i in range(len(s)):
if s[i] not in tem:
tem += s[i]
count += 1
maxnum = max(count, maxnum)
else:
t = 0
for j in range(i):
if s[j] == s[i] and j >= t:
t = j
for x in range(t+1):
tem = tem[x+1:]
count -= 1
tem += s[i]
count += 1
print(tem)
return maxnum
可是這個**提交上去後,給了我個time limit exceeded
(未通過),點開一看,看到了個超長的字串未通過測試...時間過長
下面這個演算法,大致思路和我上乙個一樣,但是使用了雜湊表,讓它來記錄字元的索引,在雜湊表中先把每個字元的值初始化為-1,出現第一次就把值改為該字元所在字串的位置
class solution:
# @param s
# @return
def lengthoflongestsubstring(self, s):
start = 0
maxnum = 0
dic = {}
for i in range(len(s)):
dic[s[i]] = -1
for i in range(len(s)):
if dic[s[i]] != -1:
while start <= dic[s[i]]:
dic[s[start]] = -1
start += 1
maxnum = max(maxnum, i-start+1)
dic[s[i]] = i
return maxnum
演算法 LeetCode刷題
given 1,3 2,6 8,10 15,18 return 1,6 8,10 15,18 關鍵就是a 1 b 0 也就是array i 1 1 array i 0 const merge array return array console.log merge 1,3 8,10 2,6 15,1...
演算法題 LeetCode刷題(五)
資料結構和演算法是程式設計路上永遠無法避開的兩個核心知識點,本系列 演算法題 旨在記錄刷題過程中的一些心得體會,將會挑出leetcode等最具代表性的題目進行解析,題解基本都來自於leetcode官網 本文是第五篇。給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以...
演算法小白 LeetCode刷題篇(一)
題目指路 題目描述 編寫乙個函式,以字串作為輸入,反轉該字串中的母音字母。示例 1 輸入 hello 輸出 holle 示例 2 輸入 leetcode 輸出 leotcede 思路一 比較菜的雙指標 兩邊的指標逐漸向中間逼近,直到兩指標重合跳出迴圈。兩指標移動的時候分為以下幾種情況 1.當左指標沒...