leetcode 演算法刷題 一

2022-07-20 18:51:12 字數 3624 閱讀 5443

今天開始刷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,同時我新建了countmaxnum變數,用來記錄最長子字串的長度,返回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.當左指標沒...