爲何我要刷leetcode?換工做?不是!那是?玩!巴菲特的雙目標清單系統,基本方法是列兩個清單,一個是職業生涯最重要的目標(不超過5個),另外一個是比較重要的目標。對於比較重要的目標,要像躲避瘟疫同樣的去躲避它們,不投入任何的時間和精力,把這些資源花在最重要的目標上。這個雙目標清單系統以方法的形式說明三件事:面試
1,目標很重要算法
2,專一頗有力量數組
3,比起「有所爲」、「有所不爲」更爲關鍵數據結構
因此當我想作一件事情,可是想不到這件事情能給我帶來實在的收益時,我就定義爲「玩」。就像看電影、喝奶茶同樣。我只是去作這件事,在有閒暇的時候佔用一些時間,並不佔用精力。 我工做十二年,技術一直很差。雖然對一部分人來講還算能夠,在美團工做、百餘項技術發明專利、kubernetes源碼貢獻者。可是即便在名聲每況愈下的母校同屆同專業畢業生中,也算是菜的。原來我以前一直定義爲沒有天賦。在畢業的第一家公司,被做爲技術招進來,可是由於語言學的太好作的是翻譯的工做。一年過日語1級。參加任何和日語相關的比賽,只要我參加,第一名確定是個人,沒別人什麼事兒。別人說這是天賦,我那時候沒想過這個問題,只是不禁自主的把精力都花在了這上面。而對於工做,只是完成任務。對於技術,只是用到纔去學。好久以後我才說服本身:個人沒有天賦只是沒投入精力而已。在一件事上有多少天賦取決於在這上面成功的渴望有多強烈。因此如今,我有了一個重心:作好工做中須要的技術。其餘想作的事情,就不要投入什麼精力,保持專一。實際上刷leetcode對我是有好處的。函數
1,我不去面試,可是我有可能面試別人。別人在寫算法的時候,我須要有思考纔不至於用來面試別人的時間對本身沒有成長。也是對面試者的負責。測試
2,刷leetcode,我用的是go語言。工做中暫時還沒用。可是我是作容器的,早晚是要用的,提早熟悉起來。ui
3,算是對以前包括大學四年的一個回顧總結,將以前的一些知識體系化翻譯
如下是我刷了14道平均難度在簡單級別的算法以後,作的梳理。設計
leetcode有些測試用例不全,好比下面「最大子序和」一題中,測試用例就沒包含數組中數組全爲負數的狀況。這個不重要。重要的是玩也要玩的有方法論指導,作個總結覆盤。能作到這一點,就算本身沒考上2十一、985,也能影響下一代,在拼娃的競爭中得到成功。
先看梳理一下總體考察點,由於刷題少,只是作出一個最小骨架。後續若是有時間再作題,直接加節點便可。算是一個MVP(最小可行產品,詳見《精益創業》)。指針
數據結構就不提了,從下面具體事例中能夠看到雙指針的題目佔比大。緣由是算法主要解決時空最優的問題。而雙指針在基本不增長空間開銷的基礎上在不少狀況下能夠將時間複雜度減小到1/n。
下面展現一下最大公約數算法的效果:
題目大意
給定一個目標值,要在一個給定數組中找到兩個數,它們的和爲目標值。
解題思路
使用map的數據結構,遍歷過程當中找到從map中取出值爲目標值減去當前值的數。
詳情可參考:
https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-gojie-fa-by-xie-xiao-jing/
知識點
數據結構->哈希表
題目大意
判斷一個整數是迴文數是指從左到右和從右到左讀到的內容是一致的
解題思路
將整數轉爲數組,利用數組。將整數分爲一個byte數組。遍歷數組的一半。從左開始的和從右開始的相對位置同樣的數字都應該是同樣就是迴文數,不然就不是迴文數。
詳情可參考:
https://leetcode-cn.com/problems/palindrome-number/solution/hui-wen-shu-gojie-fa-by-xie-xiao-jing/
知識點
數據結構->數組
題目大意
由於瞭解羅馬數字也是一種知識,因此我把完整的題目寫下來。
羅馬數字包含如下七種字符: I, V, X, L,C,D 和 M。
字符 數值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 羅馬數字 2 寫作 II ,即爲兩個並列的 1。12 寫作 XII ,即爲 X + II 。27 寫作 XXVII, 即爲 XX + V + II 。
一般狀況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫作 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減少數 1 獲得的數值 4 。一樣地,數字 9 表示爲 IX。這個特殊的規則只適用於如下六種狀況:
I 能夠放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。
X 能夠放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。
C 能夠放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。
給定一個羅馬數字,將其轉換成整數。輸入確保在 1 到 3999 的範圍內。
解題思路
將全部字母的組合存入哈希表,遍歷時先判斷是不是雙字母的,不是再判斷是不是單字母的。
詳情可參考:
https://leetcode-cn.com/problems/roman-to-integer/solution/luo-ma-shu-zi-zhuan-zheng-shu-gojie-fa-by-xie-xiao/
知識點
數據結構->哈希表
題目大意
給定一個僅包含大小寫字母和空格 ' ' 的字符串,返回其最後一個單詞的長度。
解題思路
這道題對於常常寫業務代碼的同窗來講可能很簡單,由於看懂題了,運用類庫就作出來了。這道題能夠歸結爲字符串數組的使用。
詳情可參考:
https://leetcode-cn.com/problems/length-of-last-word/solution/zui-hou-yi-ge-dan-ci-de-chang-du-gojie-fa-by-xie-x/
知識點
數據結構->數組
題目大意
報數序列是一個整數序列,按照其中的整數的順序進行報數,獲得下一個數。
解題思路
使用兩個數組,一個存放當前的整數序列中全部的數值,另外一個存放每一個字符出現的個數。打印的時候打印一個數組,再打印對應的個數就獲得一個新數。若是還有下一個,重複此過程。
詳情可參考:
https://leetcode-cn.com/problems/count-and-say/solution/bao-shu-gojie-fa-by-xie-xiao-jing/
知識點
數據結構->數組
題目大意
與題目「羅馬數字轉爲整數」相反,給定一個整數,將其轉爲羅馬數字。輸入確保在 1 到 3999 的範圍內。
解題思路
貪心算法,每次選擇局部最優
詳情可參考:
https://leetcode-cn.com/problems/integer-to-roman/solution/zheng-shu-zhuan-luo-ma-shu-zi-goliang-chong-jie-fa/
知識點
基礎算法->貪心算法
題目大意
編寫一個函數來查找字符串數組中的最長公共前綴。若是不存在公共前綴,返回空字符串 「"
解題思路
能夠將這個字符串數組轉成單個字符的二維數組遍歷。也能夠採用分治法,直到分解成兩個字符串比較。
詳情可參考:
https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-goliang-chong-jie-fa/
知識點
數據結構->二維數組
基礎算法->分治法
題目大意
給定兩個字符串A和B,求最大公因子
解題思路
最大公因子存在的充要條件A+B=B+A。判斷存在公因子,則公因子的長度不大於(A長度-B長度絕對值,爲新的A)與B長度的最小值。循環直到A的長度等於B的長度。
知識點
基礎算法->最大公約數算法
詳情可參考:
https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-gojie-fa-by-xie-/
題目大意
給定一個排序數組,你須要在原地刪除重複出現的元素,使得每一個元素只出現一次,返回移除後數組的新長度。
解題思路
放置兩個指針 slow和 fast,其中slow是慢指針,而fast是快指針。只要 nums[slow]等於nums[fast],就刪除此元素。不然讓slow=fast繼續遍歷。
詳情可參考:
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-xiang-goj/
知識點
基礎算法->雙指針法
題目大意
給定一組字符,使用原地算法將其壓縮。壓縮後的長度必須始終小於或等於原數組長度。數組的每一個元素應該是長度爲1 的字符(不是 int 整數類型)。在完成原地修改輸入數組後,返回數組的新長度。
解題思路
設立一個寫指針,初始爲第1個字符。一個讀指針,初始爲第2個字符。讀指針讀到與寫指針相同的數則直接加1,不一樣的數,則它們的距離就是這個寫指針對應字符出現的次數。而後讓寫指針等於讀指針重複此過程到結束。
詳情可參考:
https://leetcode-cn.com/problems/string-compression/solution/ya-suo-zi-fu-chuan-gojie-fa-by-xie-xiao-jing/
知識點
基礎算法->雙指針法
題目大意
給定一個數組 nums 和一個值 val,你須要原地移除全部數值等於 val 的元素,返回移除後數組的新長度。
解題思路
使用一個指針A遍歷,另外一個指針指向不重複的新數組位置B(這個新數組是邏輯上的,可使用原地算法覆蓋原數組)。遍歷到一個不爲val的元素,則B加1.
詳情可參考:
https://leetcode-cn.com/problems/remove-element/solution/yi-chu-yuan-su-goliang-chong-jie-fa-by-xie-xiao-ji/
知識點
基礎算法->雙指針
題目大意
給定兩個有序整數數組 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成爲一個有序數組。其中nums1長度是num1有效數據長度加上nums2的和。
解題思路
保存兩個指針,一個是遍歷nums1的指針,一個是遍歷nums2的指針。從後向前遍歷大小。從後面開始的緣由是可使用原地算法,直接將最後面的數直接放到nums1的後面,同時已經放好的數組不須要再次移動。
詳情可參考:
https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-gojie-fa-by-xie-xia/
知識點
基礎算法->雙指針
題目大意
給定一個整數數組,找到一個具備最大和的連續子數組(子數組最少包含一個元素),返回其最大和。
解題思路
保存兩個數,一個是當前爲止的最大和A,一個是從這個最大和的子數組的開始位置到最大和的連續子數組B。遍歷數組,若是B加上當前值的和C大於A,則A等於C。若是C小於0,則B等於0從新開始計數,不然B等於C。其實是動態規劃的思想。
詳情可參考:
https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-gojie-fa-by-xie-xiao-jing/
知識點
基礎算法->動態規劃
題目大意
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。
若是你最多隻容許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。
解題思路
買賣股票的最佳時機抽象一下就是找到一個子序列尾和首的差最大。保存兩個數,一個是當前爲止的尾和首的差最大A,另外是計算這個最佳值的開始位置。若是當前位置的值減去最佳值開始位置比A還要佳,則替換A。不然若是<0,則當前位置爲最低谷。也是動態規劃的思想。
詳情可參考:
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/mai-mai-gu-piao-de-zui-jia-shi-ji-gojie-fa-by-xie-/
知識點
基礎算法->動態規劃
我工做十二年了都在刷leetcode,最重要的緣由是於想要理解。理解周圍的人:年輕人、領導、同事都同樣。設身處地作別人作的事情,理解別人的想法、思路,更好的溝通。