關於刷題

by 王翰元

上週把 Grind 75 裡 array 的題目做完了第一輪,想寫個文章快速總結自己學到的東西。

一直以來我都很抗拒刷題這件事,覺得不知道為什麼要浪費時間做這種事,不過這次刷完之後稍微有了不同感想。

明明已經理解概念、花了兩個小時卻還是實作不出 ThreeSum 的 Combination Sum;發現自己一直在相同的迴圈裡:想靠自己想出答案,花了 2-3 個小時發現解不出來、覺得自己像個白癡、想把電腦砸爛、乖乖看答案。

與其說我學到的是資料結構或演算法,不如說我學到的是自己的程度和基礎遠遠不夠的事實。在統計系學的那些 R 語言、做 ML 會用到的 python——跟刷題完全是兩回事。

我發現要自己寫出 pseudo code 的過程,其實就是要把思緒放的非常非常慢,才能把每一個微小的步驟和思緒都慢慢拆解出來。有時候以為概念懂了,實作的時候卻遇到一大堆問題,才知道自己並不是理論搞不懂,而是「把概念化為程式」這一塊肌肉缺少正確的訓練。

從大學剛學程式的時候,我就很逃避學資料結構和演算法。我一直覺得那些不是我能搞懂的東西,也覺得很無聊、不太想弄懂。

一開始真的很難突然就要吸收什麼雙指針、one-pass hashmap(直到現在我還是覺得雙指針很不適合我的腦袋),就算看了別人的作法好像也還是似懂非懂,覺得自己沒有真正理解那些作法的精髓,沒有從中感受到什麼美妙之處,單純記下別人的做法也獲得不了什麼成就感。

不過在好幾次的痛苦之後,也才逐漸發現自己確實太急躁,剛看完 stack 和 queue 的影片解說覺得好像很簡單,馬上就想跳過 easy 的題目進到 medium,只能說自己真的太小看這些基礎知識。

也發現光是要把問題描述清楚也不容易。而通常的狀況是,如果能夠把問題描述清楚,也就解決一半了。如果連問題都沒辦法講出清楚,那很能就是缺少了某些必要知識。

例如 combination sum 這種題目,一開始我只會用迴圈的方法來做,但查了才知道原來這天生就是遞迴的題目,用我習慣的迴圈反而會變難。

雖然我還是難以從解題過程裡感受到什麼愉悅,也還是感受不到解題會為我帶來什麼意義,但我想短短兩個禮拜的認真刷題,讓我意識到自己在過去的工作經驗裡,似乎養成一種不去探究背後原因、只求做出結果的習慣,讓我小瞧了寫程式這件事。

最大的癥結點,我想還是在「很想靠自己想出來」。我仍然覺得要自己想出來才比較有成就感。不過,有些時候缺少必要的知識就是沒辦法。我想這大概是失去了初學者的心態,以為自己用了五年就應該什麼東西都能自己想出來,實際上就是大錯特錯。

也許重複了,不過到目前為止,刷題教會我最多的,與其說是演算法跟資料結構,不如說是給自己太急躁的心態上了一課。明明在人生上遇到問題會想要看書、找人問問題,但是在寫程式上卻完全失去了這種心態。

試著讓自己重新化為一張白紙、重新吸收已有的做法——可能才是我需要做的。

Leave a Comment