編寫乙個程式,找到兩個單鏈表相交的起始節點。
如下面的兩個鍊錶**:**
在節點 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.最小高度的相容設定方法 了解...