
1. 力扣刷題實戰2026年1月18日解題記錄今天想和大家分享我在力扣LeetCode平臺上的刷題實戰經歷。作為一名程序員我堅持每天刷題已經三年多了這個習慣不僅幫助我保持編碼手感更重要的是培養了我解決問題的思維方式。2026年1月18日這天的刷題內容特別有意思涉及了幾道經典題目和一些新出的題目讓我收獲頗豐。刷題不是簡單地完成題目而是要理解每道題背后的算法思想和應用場景。我會記錄下每道題的解題思路、遇到的坑以及優化方法希望能給正在刷題的你一些啟發。無論你是準備面試的新手還是想提升算法能力的老手這些實戰經驗都會對你有所幫助。2. 當日刷題題目解析2.1 兩數之和經典重溫這道題可以說是力扣的Hello World了題目要求在一個整數數組中找到兩個數使它們的和等于一個特定的目標值。雖然題目簡單但蘊含著重要的算法思想。我選擇了用哈希表在C中是unordered_map來解決這個問題。具體思路是遍歷數組對于每個元素計算目標值與該元素的差值然后檢查這個差值是否已經在哈希表中存在。如果存在就找到了解如果不存在就把當前元素的值和索引存入哈希表。vectorint twoSum(vectorint nums, int target) { unordered_mapint, int num_map; for (int i 0; i nums.size(); i) { int complement target - nums[i]; if (num_map.find(complement) ! num_map.end()) { return {num_map[complement], i}; } num_map[nums[i]] i; } return {}; }這個解法的時間復雜度是O(n)空間復雜度也是O(n)。雖然題目簡單但有幾個需要注意的點要注意處理重復元素的情況要考慮沒有解的情況邊界條件如空數組需要處理2.2 二叉樹的中序遍歷迭代實現這道題要求實現二叉樹的中序遍歷通常我們會用遞歸方法但面試時面試官往往會要求用迭代方法實現。我選擇了用棧來模擬遞歸的過程。vectorint inorderTraversal(TreeNode* root) { vectorint result; stackTreeNode* st; TreeNode* curr root; while (curr ! nullptr || !st.empty()) { while (curr ! nullptr) { st.push(curr); curr curr-left; } curr st.top(); st.pop(); result.push_back(curr-val); curr curr-right; } return result; }這個解法有幾個關鍵點使用棧來保存待處理的節點先盡可能往左子樹深入處理完左子樹后再處理當前節點最后轉向右子樹注意迭代實現比遞歸實現更容易出現空指針異常要特別注意對空節點的處理。3. 力扣熱題100中的精選題目3.1 最長回文子串這道題要求找出字符串中的最長回文子串。我嘗試了中心擴展法這種方法的時間復雜度是O(n^2)空間復雜度是O(1)。string longestPalindrome(string s) { if (s.empty()) return ; int start 0, end 0; for (int i 0; i s.size(); i) { int len1 expandAroundCenter(s, i, i); int len2 expandAroundCenter(s, i, i 1); int len max(len1, len2); if (len end - start) { start i - (len - 1) / 2; end i len / 2; } } return s.substr(start, end - start 1); } int expandAroundCenter(const string s, int left, int right) { while (left 0 right s.size() s[left] s[right]) { left--; right; } return right - left - 1; }這個解法的關鍵在于回文串可能是奇數長度或偶數長度從每個字符或每對字符向兩邊擴展記錄最大長度和對應的子串位置3.2 合并兩個有序鏈表這道題要求將兩個升序鏈表合并為一個新的升序鏈表。我使用了迭代的方法比較兩個鏈表的當前節點將較小的節點連接到結果鏈表中。ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode dummy(0); ListNode* tail dummy; while (l1 l2) { if (l1-val l2-val) { tail-next l1; l1 l1-next; } else { tail-next l2; l2 l2-next; } tail tail-next; } tail-next l1 ? l1 : l2; return dummy.next; }這個解法有幾個需要注意的地方使用啞節點簡化鏈表操作當一個鏈表遍歷完后直接連接另一個鏈表的剩余部分注意處理空鏈表的情況4. 刷題技巧與經驗分享4.1 如何高效刷題經過多年的刷題實踐我總結出了一些高效刷題的方法分類刷題不要隨機刷題應該按題目類型分類刷比如一周專門刷二叉樹一周專門刷動態規劃。這樣可以加深對某一類問題的理解。五遍刷題法第一遍看題解理解思路第二遍自己實現第三遍24小時后重新實現第四遍一周后重新實現第五遍面試前復習記錄錯題本把做錯的題目和解題思路記錄下來定期復習。時間管理建議每天固定時間刷題形成習慣。我一般早上花1小時刷題效果最好。4.2 常見錯誤與調試技巧在刷題過程中我遇到過很多錯誤這里分享幾個常見的數組越界特別是在處理字符串或數組時容易忘記檢查邊界條件。建議在訪問數組元素前先檢查索引是否有效。指針操作錯誤鏈表題目中經常出現指針操作錯誤比如忘記移動指針或者訪問了已經釋放的內存。可以使用紙筆畫圖來幫助理解指針的變化。遞歸棧溢出遞歸解法雖然簡潔但容易導致棧溢出。對于大數據集應該考慮使用迭代方法。變量未初始化特別是C中局部變量不會自動初始化使用前一定要記得初始化。調試技巧使用小數據測試邊界條件打印中間結果幫助理解程序執行過程使用調試器單步執行觀察變量變化4.3 面試準備建議如果你是為了面試而刷題我有幾點建議理解比記憶重要面試官更看重你解決問題的思路而不是你是否背過答案。溝通很重要在解題過程中要不斷與面試官交流你的思路即使還沒完全想出來。考慮多種解法對于一個問題盡量想出多種解法并分析它們的時間復雜度和空間復雜度。寫干凈代碼面試時寫的代碼要清晰易讀有適當的注釋和變量命名。測試用例寫完代碼后要主動提出測試用例包括正常情況和邊界情況。5. 力扣刷題資源推薦5.1 力扣官方資源力扣平臺本身提供了很多優質資源力扣熱題100精選的100道高頻面試題力扣學習計劃系統化的學習路徑每日一題保持刷題習慣的好方法討論區可以看到其他人的解題思路5.2 第三方學習資源除了力扣平臺我還推薦以下資源《算法導論》經典算法教材適合深入理解算法原理《劍指Offer》針對面試的算法題集《編程珠璣》培養算法思維的好書各大高校的公開課如MIT的算法課5.3 刷題工具推薦好的工具可以提高刷題效率VS Code輕量級代碼編輯器配合插件可以很好支持多種語言CLion專業的C IDE調試功能強大LeetHub瀏覽器插件可以自動同步力扣代碼到GitHubDraw.io畫圖工具幫助理解復雜的數據結構6. 個人刷題心得堅持刷題三年多我最大的體會是刷題不是目的而是手段。通過刷題我不僅提高了編程能力更重要的是培養了解決問題的思維方式。這種思維方式在工作中同樣適用比如如何分解復雜問題如何優化解決方案等。刷題過程中挫折是難免的。遇到難題時不要輕易放棄也不要馬上看答案。給自己足夠的時間思考即使最終沒做出來思考的過程也是有價值的。實在想不出來時再看題解然后過幾天再重新做一遍。最后刷題要注重質量而非數量。與其快速刷100道題但都一知半解不如精刷50道題但每道都徹底理解。每道經典題目都蘊含著重要的算法思想理解這些思想比記住解法更重要。