力扣學習筆記day13

2021-10-17 09:39:54 字數 3417 閱讀 6393

編寫乙個程式,找到兩個單鏈表相交的起始節點。

如下面的兩個鍊錶**:**

在節點 c1 開始相交

輸入:intersectval = 8, lista = [4,1,8,4,5], listb = [5,0,1,8,4,5], skipa = 2, skipb = 3

輸出:reference of the node with value = 8

輸入解釋:相交節點的值為 8 (注意,如果兩個鍊錶相交則不能為 0)。從各自的表頭開始算起,鍊錶 a 為 [4,1,8,4,5],鍊錶 b 為 [5,0,1,8,4,5]。在 a 中,相交節點前有 2 個節點;在 b 中,相交節點前有 3 個節點。

首先由題意我們可以馬上想到的就是,讓用兩個指標在等長的路徑上前進,這樣就可以保證兩個指標可以同時到達相交的節點。

具體的做法為:

先通過兩個遍歷獲取兩個鍊錶的長度,進而得到長度差

將兩個指標回到鍊錶頭部,長指標先走差值個步數,保證接下來兩個指標的剩餘路徑等長

兩個指標同時開始遍歷,並逐個比較,如果找到,返回該節點

改進:

上面這個做法比較繁瑣,得 先做兩個遍歷,再回到頭部重新遍歷,其實目的只有乙個, 就是保證兩個指標在等長的鍊錶上遍歷, 為了達到這個要求,還有一種簡便的方法,就是把兩個鍊錶拼起來,這樣就可以保證,最後一段路一定是相同的

cura,curb=heada,headb

while cura!=curb:

cura=cura.

next

if cura else headb

curb=curb.

next

if curb else heada

return cura

這樣兩種情況會結束迴圈,一種是兩個節點相遇;另一種是沒有相交點,兩個都為空。

給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列**現次數 大於 ⌊ n/2 ⌋ 的元素。

你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。

eg

輸入:[3,2,3]

輸出:3

輸入:[2,2,1,1,1,2,2]

輸出:2

本題的有個點需要抓住,就是給出的陣列保證存在多數元素,所以無需再去判斷最多的那個元素是否需要 大於 ⌊ n/2 ⌋(因為沒看清題我確實寫了這個判斷……)

統計

以此為條件,有很多種解題方法,我想到的第乙個方法就是統計,統計出每個字元出現的個數,然後存到字典中,輸出值最大的元素的鍵。這個方法可以利用python的 counter 方法:

cou=counter(nums)

#返回出現最多的n個值,此處n為1

res=cou.most_common(1)

return res[0][0]

排序後返回中間值這個方法也很好理解,因為多數的性質決定了,無論這個數的大小,它必然覆蓋有序陣列的中心點,所以可以排序後返回中間節點

nums.sort(

)return nums[

len(nums)//2

]

摩爾投票這種解法的思路是,遍歷過程中,

換句話說,就是不同的數會抵消,這樣最後票數還為正的數當選。在本題的條件下,即便所有多數元素以外的數用來抵消多數元素,它最後的票數必然還是正的。

res=nums[0]

count=

1for i in

range(1

,len

(nums)):

if count==0:

count=

1 res=nums[i]

elif nums[i]

==res:

count+=

1else

: count-=

1return res

反轉乙個單鏈表。

高階:

你可以迭代或遞迴地反轉鍊錶。你能否用兩種方法解決這道題?

定義乙個空節點,進行一次遍歷,每次將遍歷的元素接到空節點的後面。

需要遍歷鍊錶一次,所以時間複雜度為o(n),空間複雜度為o(1)

helper=listnode(

none

)while head:

tmp=head

head=head.

next

tmp.

next

=helper.

next

helper.

next

=tmp

return helper.

next

遞迴方法實際上從鍊錶後面部分開始翻轉,對於當前節點head,當它後面的鍊錶完成反轉後,它接下來也要接到反轉鍊錶尾部,即head 與 head.next 之間的指向關係需要對換,做法為:

head.next的 next 指向head

head.

next

.next

=head

切斷head的next(這個操作主要考慮的是原鍊錶的頭部)

head.

next

實現:

def

reverselist

(self,head:listnode)

->listnode:

ifnot head or

not head.

next

:return head

newhead=self.reverselist(head.

next

) head.

next

.next

=head

head.

next

=none

return newhead

DAY13學習筆記

疊加多個裝飾器 當乙個被裝飾的物件同時疊加多個裝飾器時 裝飾器的載入順序是 自下而上。迭代器 什麼是迭代器 迭代指的是乙個重複的過程,每一次重複都是基於上一次的結果而來的。迭代器指的是迭代取值的工具,該工具的特點是可以不依賴於索引取值。為何要用迭代器 為了找出一種通用的 可以不依賴於索引的迭代取值方...

C 學習筆記 day13

1 資料 記憶體中 變數 磁碟上 檔案 2 把資料從其他的裝置搬到記憶體中 輸入 讀 把記憶體中的資料放到其他裝置中 輸出 寫 3 流物質的定向移動,輸入輸出流中是資料的定向移動 輸入流的源頭 檔案 目的地 記憶體 輸出流的源頭 記憶體 目的地 檔案 4 標準輸出裝置 顯示器 標準輸入裝置 鍵盤 鍵...

前端學習Day13

一.如果考慮相容最小高度的設定 了解 1.正常專案中 最小高度直接用min height即可。如果考慮相容 min height 在ie6不相容,ie6預設把height解析成最小高度。注 如果height 和 min height同是出現,執行height固定高度。2.最小高度的相容設定方法 了解...