當前位置: 妍妍網 > 碼農

35歲+程式設計師男朋友被裁,該怎麽安慰他?

2024-03-16碼農

男朋友被裁員了,該怎麽安慰他?一位35歲+程式設計師女朋友線上尋求方法

她表示自己男朋友35+程式設計師被裁,不知道以後要幹嘛,很迷茫….以前只是看裁員的貼文,這一次真的輪到自己,才發現這種感受是形容不來的…..哎,還想著能狗到40歲,沒想到這麽快…..

其實35被裁已經不是什麽新鮮事情了,雖然知道這樣不對,但是作為社畜的我們也無力改變。

怎麽說呢,就真的挺難的,網友表示35歲了後面也不知道幹嘛,考公也考不了, 互聯網真的沒法養老 不該抱有幻想

還有網友表示,35歲+的女生更難,起碼男生還是有機會的,但是女生是幾乎沒有

為了緩解小姐姐的憂慮,不少網友紛紛起哄,不如直接換個男朋友吧,焦慮秒沒

最後還是那句話, 繼續找工作唄,還能幹嘛。工作難找也還是得找啊

下面是今日的大廠演算法題

今日演算法題 ,來自LeetCode的第23題:合並 K 個升序連結串列,下面是我的演算法思路及實作,讓我們來看看吧。

# 演算法題目

給你一個連結串列陣列,每個連結串列都已經按升序排列。

請你將所有連結串列合並到一個升序連結串列中,返回合並後的連結串列。

# 演算法思路

1.分治法:

將K個連結串列分成兩部份,先分別處理這兩部份,然後將兩個部份的結果合並。這一過程遞迴進行,直到問題規模縮小到可以直接解決。

2.合並兩個有序連結串列:

在分治的過程中,我們需要一個輔助函式來合並兩個有序連結串列。這個函式從兩個連結串列的頭節點開始,比較它們的值,選擇較小的節點加入到結果連結串列中,然後移動指標繼續比較,直至所有節點都被合並。

3.遞迴合並:

不斷將連結串列對分成更小的子集,直到每個子集只有一個連結串列或沒有連結串列。然後開始合並這些連結串列,最終得到單個排序連結串列。

# 程式碼實作

C語言實作

由於C語言程式碼的實作相對較長,這裏提供一個概述思路和關鍵函式的虛擬碼:

//定義連結串列結構體`struct ListNode`structListNode {int val;structListNode *next;};//實作`mergeTwoLists(struct ListNode* a, struct ListNode* b)`函式合並兩個有序連結串列struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){structListNodepreHead;structListNode *p = &preHead; preHead.next = NULL;while (l1 != NULL && l2 != NULL) {if (l1->val < l2->val) { p->next = l1; l1 = l1->next; } else { p->next = l2; l2 = l2->next; } p = p->next; }if (l1 != NULL) { p->next = l1; } else { p->next = l2; }return preHead.next;}//使用分治法`mergeKLists(struct ListNode** lists, int listsSize)`,遞迴地將連結串列陣列分成更小的部份,使用`mergeTwoLists`函式合並struct ListNode* merge(struct ListNode** lists, int left, int right){if (left == right) {return lists[left]; }if (left > right) {returnNULL; }int mid = left + (right - left) / 2;structListNode* l1 = merge(lists, left, mid);structListNode* l2 = merge(lists, mid + 1, right);return mergeTwoLists(l1, l2);}struct ListNode* mergeKLists(struct ListNode** lists, int listsSize){return merge(lists, 0, listsSize - 1);}

Java實作

classListNode{ int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; }}public classSolution{public ListNode mergeKLists(ListNode[] lists) {if (lists.length == 0) returnnull;return merge(lists, 0, lists.length - 1); }private ListNode merge(ListNode[] lists, int left, int right) {if (left == right) return lists[left]; int mid = left + (right - left) / 2; ListNode l1 = merge(lists, left, mid); ListNode l2 = merge(lists, mid + 1, right);return mergeTwoLists(l1, l2); }private ListNode mergeTwoLists(ListNode l1, ListNode l2) {if (l1 == null) return l2;if (l2 == null) return l1;if (l1.val < l2.val) { l1.next = mergeTwoLists(l1.next, l2);return l1; } else { l2.next = mergeTwoLists(l1, l2.next);return l2; } }}

Python實作

classListNode:def__init__(self, val=0, next=None): self.val = val self.next = nextdefmergeKLists(lists):ifnot lists or len(lists) == 0:returnNonedefmergeTwoLists(l1, l2):ifnot l1:return l2ifnot l2:return l1if l1.val < l2.val: l1.next = mergeTwoLists(l1.next, l2)return l1else: l2.next = mergeTwoLists(l1, l2.next)return l2defmerge(lists, left, right):if left == right:return lists[left] mid = left + (right - left) // 2 l1 = merge(lists, left, mid) l2 = merge(lists, mid + 1, right)return mergeTwoLists(l1, l2)return merge(lists, 0, len(lists) - 1)

# 演算法解析

分治法在解決這類問題時極為有效,它透過遞迴地將問題分解為更小的子問題來降低問題的復雜度,然後再合並結果。

這種方法的時間復雜度為O(N log K),其中N是所有連結串列中元素的總和,K是連結串列個數。這是因為每次叠代中元素的比較次數總共為N,而分治的深度為log K。

# 範例和測試

假設我們有K=3個連結串列[1->4->5, 1->3->4, 2->6],使用上述Python程式碼進行合並,結果應該是一個新的有序連結串列1->1->2->3->4->4->5->6。

# 總結

合並K個升序連結串列是一個典型的分治法套用案例,透過將問題分解為可管理的小部份,再逐步合並結果,我們可以高效地解決這個問題。不同程式語言的實作雖有差異,但演算法的核心思想是一致的

熱門推薦