第一天刷題

2021-10-14 11:51:52 字數 4646 閱讀 8369

給出兩個非空的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照逆序的方式儲存的,並且它們的每個節點只能儲存一位數字。

如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。

您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。

示例1:

輸入:l1 =[2

,4,3

], l2 =[5

,6,4

]輸出:[7,

0,8]

解釋:342

+465

=807

示例2:

輸入:l1 =[9

,9,9

,9,9

,9,9

], l2 =[9

,9,9

,9]輸出:[8,

9,9,

9,0,

0,0,

1]

示例3:

輸入:l1 =[0

], l2 =[0

]輸出:[

0]

模擬兩個數相加,結果返回乙個相加之後和的鍊錶。

同時遍歷兩個鍊錶,逐位計算它們的和,並與當前位置的進製值相加。具體而言,如果當前兩個鍊錶處相應位置的數字為 n1,n2,進製值為carry,則它們的和n1+n2+carry;其中,答案鍊錶處相應位置的數字為 (n1+n2+carry)%10,而新的進製值為⌊n1+n2+carry⌋。

如果兩個鍊錶的長度不同,則可以認為長度短的鍊錶的後面有若干個 0 。

此外,如果鍊錶遍歷結束後,有carry>0,還需要在答案鍊錶的後面附加乙個節點,節點的值為 carry。

# definition for singly-linked list.

# class listnode(object):

# def __init__(self, val=0, next=none):

# self.val = val

# self.next = next

class

solution

(object):

defaddtwonumbers

(self, l1, l2)

:"""

:type l1: listnode

:type l2: listnode

:rtype: listnode

"""head = point = listnode(0)

# 定義煉表頭節點

carry =

0while l1 or l2:

#同時遍歷這兩個鍊錶的節點

new_point = listnode(0)

ifnot l1 :

# l1節點為空的情況,把該節點的值當作0

res = l2.val+carry

new_point.val = res%

10 carry = res //

10 l2=l2.

next

elif

not l2 :

# l2節點為空的情況,把該節點的值當作0

res = l1.val + carry

new_point.val = res%

10 carry = res //

10 l1=l1.

next

else

:# 兩個節點都有值的情況

res = l2.val+l1.val+carry

# 兩個節點的值相加的和與10取余為新節點

new_point.val = res %

10# 進製值是除以10取整

carry = res //

10# 同時指向下乙個節點

l2=l2.

next

l1=l1.

next

# 把計算後的節點加在point的後面

point.

next

= new_point

# 指標往後移

point = point.

next

# 遍歷完所有節點後,判斷最後一次迴圈時是否進製,即carry是否為1

if carry ==1:

new_point = listnode(1)

point.

next

= new_point

return head.

next

時間複雜度:o(max(m,n)),假設m和n分別表示l1和l2的長度,上面的演算法最多重複max(m,n)次

空間複雜度:o(max(m,n)),新列表的長度最多為max(m,n) + 1

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。

請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。

你可以假設 nums1 和 nums2 不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

則中位數是 (2 + 3)/2 = 2.5

首先把兩個有序陣列合併為乙個有序陣列,然後根據陣列長度來確定中位數,如果陣列長度為偶數,那麼返回兩個中位數的平均值,如果陣列長度為奇數,那麼返回中位數。

class

solution

:def

findmediansortedarrays

(self, nums1, nums2)

: m =

len(nums1)

n =len(nums2)

nums1.extend(nums2)

# 合併

nums1.sort(

)# 排序

if(m + n)%2

!=0:# 如果是奇數 返回中位數

return nums1[

(m + n -1)

//2]else

:# 返回兩個中位數的平均值

return

(nums1[

(m + n)//2

-1]+ nums1[

(m + n)//2

])/2

這個時間複雜度不符合 思路比較簡單

二分查詢(後續補一下 現在沒看懂···)

給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。

示例 1

輸入:

"babad"

輸出:"bab"

注意:"aba" 也是乙個有效答案。

示例 2

輸入:

"cbbd"

輸出:"bb"

示例 3

輸入:

"a"輸出:

"a"

暴力法,列舉所有的子串,判斷該子串是否為回文

使用兩個for迴圈遍歷所有子串

執行結果:超出時間限制

class

solution

(object):

deflongestpalindrome

(self, s)

:"""

:type s: str

:rtype: str

"""iflen

(s)<2:

return s

begin =

0 maxlen=

1for i in

range

(len

(s)-1)

:for j in

range

(i+1

,len

(s)):if

((j - i +1)

> maxlen)

&(self.if_huiwen(s,i,j)):

maxlen = j - i +

1 begin = i

return s[begin:begin+maxlen]

defif_huiwen

(self,s,left,right)

:while leftif s[left]

!= s[right]

:return

false

left +=

1 right -=

1return

true

時間複雜度:o(n^3)

空間複雜度:o(1)

動態規劃:後續補上 之前沒學過

leetcode刷題第一天

給你兩個 非空 的鍊錶,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式儲存的,並且每個節點只能儲存 一位 數字。請你將兩個數相加,並以相同形式返回乙個表示和的鍊錶。你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。class solution def addtwonumbers se...

刷題第一天記錄

用於接收輸入的內容。注意 得到的是字串型別 有raise語句的地方就是異常,不管程式本身是不是真的有異常 建立乙個新的異常類 繼承自exception類 異常名描述 baseerror 所有異常的基類 systemexit 直譯器請求退出 keyboardinterrupt 使用者中斷執行 exce...

leetcode刷題筆記 第一天

題目說明 給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。解題思路 首先判斷needle是否在haystack中,如果存在則返還needle所在位置。如果不存在,則返還 1。def s...