如果能一次到位當然好,不過,可能要多加練習,多開闊眼界增加創造力和聯想力才能達到這個程度吧。
我記得有一個題目正好可以體驗到這點。
「妳試試258. Add Digits這題,妳能馬上想到O(1)的解法嗎?」
「我看看唷,把數字的所有位數不停相加,直到剩下個位數字。這個可以用O(1)做到?學姊別騙人,我只能想到這個耶。」
class Solution {
fun addDigits(num: Int): Int {
var result = num
while (result > 9) {
result = result % 10 + result / 10
}
return result
}
}
學妹的解法滿乾淨俐落,大概是之前解了幾題,沒那麼緊張了。
「給妳提示,妳還記得小學時學的2、3、5、9倍數的辨別法嗎?」
「記得啊。2的倍數,個位數會是2、4、6、8、0;3的倍數,所有位數相加會是3的倍數;5的倍數,個位數會是5和0;9的倍數,會是所有位數相加是9的倍數。⋯⋯咦?好像和題目有點像。」學妹皺了一下眉頭很快找到突破點。「這樣不就是除了0以外的9的倍數加到最後都是9嗎!」
「沒錯,而那些不是9的倍數的數字,都可以看做9的倍數加上其他數字。」
「啊!對喔,也能這樣看!那就可以簡化成三種情境了!」
class Solution {
fun addDigits(num: Int): Int {
return when {
num == 0 -> 0
num % 9 == 0 -> 9
else -> num % 9
}
}
}
學妹送出程式碼後悶悶不樂:「怎麼之前就沒想到呢?也不是很難的想法呀。」
「其實很多思路的線索都已經在我們腦海待了很久,只是一時沒有聯想到,所以才需要多番練習,也算是重新整理大腦空間吧。」多資深的線索啊,十年前就埋下了。
話說,不知道這兩次送出的答案會是什麼樣的獎品呢?不是牛奶就好。