這道題關於條件的描述比較模糊,會讓人誤以為pos是給定的值,但其實pos只是用來說明環形鍊表的概念,真正的條件就只是給定的一個鍊表。經過簡單分析可以得到下面兩種思路:
使用第二種思路能獲得更小的空間複雜度,對之進行編碼實現、調試優化,確保提交通過並且獲得不錯的時間和空間複雜度。
剛開始做這種算法題的卡片時,我認為針對每一行做遮蓋效率低且沒必要,因為覺得自己可以輕鬆回憶出一塊代碼。前幾次複習的時候的確可行,但當一張卡片的複習間隔逐漸拉長,我發現後面想要回憶出整塊代碼比較困難,每次都要從頭過一遍整體思路才能慢慢回憶出整塊代碼,而又因為代碼是被整塊記憶的所以整體思路並不容易梳理。整塊代碼記憶,拖慢了複習卡片的速度。後來乾脆將之前做過的卡片逐個重構,結果是每行代碼每行注釋(注意區分注釋和代碼,否則容易弄混)都獨立成一張卡片。我發現這樣做不僅能讓記憶和回憶一行代碼更輕鬆,整個算法思路也更容易在腦海中勾勒出來。按照這種思路,針對這道算法題做出的卡片如下:
在Browser中查看生成的卡片:
任意選一張瀏覽:
學習和複習卡片。使用上面的方法製作完卡片之後,第一次學習卡片的時候你可能想要儘可能地回憶出來被遮住的代碼。不必這麼做,因為卡片對你來說是新的,你需要做的是學習、理解,嘗試把一行代碼(或者一個知識點)放到全局去思考它的意義。一開始不能完全把握一張卡片中包含的代碼的含義也沒問題,一張張學下去,逐漸地算法的整體思路就會自動浮現出來(奇妙的大腦)。整個過程和玩拼圖非常相似。複習的時候,針對每張卡片,可以從頭梳理整個算法思路,直到被遮蓋的這行代碼。因為我們是針對每行代碼進行記憶,所以梳理整個算法思路是件簡單的事。
按照文中的方法,逐題處理,每天堅持複習完所有卡片,相信用不了多久,算法相關的面試題就不再是絆腳石。