「這幾天兩位練習 Kata 還順利嗎?有沒有遇到什麼困難?」
「還好,題目都是可以解決的,沒什麼大問題。」曉欣在幾天的練習過後,對寫程式的自信越來越夠了。
「很好,那接下來我們就要來處理有一點點困難的部分囉!」
夏天一邊說,一邊打開了 27. Remove Element 這一題
「這題很簡單嘛!」菁菁邊說邊寫
「啊⋯⋯這邊可以不用 for
呀!改用 forEach
」「對耶!謝謝提醒!」
class Solution {
fun removeElement(nums: IntArray, `val`: Int): Int {
var l = 0
nums.forEach {
if (it != `val`) {
nums[l++] = it
}
}
return l
}
}
「真厲害!兩位都進步好多!」夏天一邊喝著美式一邊說。
「看起來今天可以再多幾題」夏天又開啟了一個題目,這次是 66. Plus One
這一題有一點點難,兩個人分別寫出了不同的寫法。
曉欣的寫法:
class Solution {
fun plusOne(digits: IntArray): IntArray {
val mutableDigits = digits.toMutableList()
mutableDigits[mutableDigits.size - 1]++
for (i in mutableDigits.size - 1 downTo 1) {
if (mutableDigits[i] == 10) {
mutableDigits[i] = 0
mutableDigits[i - 1] = mutableDigits[i - 1] + 1
}
}
if (mutableDigits[0] == 10) {
mutableDigits[0] = 0
mutableDigits.add(0, 1)
}
return mutableDigits.toIntArray()
}
}
菁菁的解法:
class Solution {
fun plusOne(digits: IntArray): IntArray {
for (i in digits.size - 1 downTo 0) {
digits[i] += 1
if (digits[i] <= 9) return digits
digits[i] = 0
}
val arr = IntArray(digits.size + 1)
arr[0] = 1
return arr
}
}
「菁菁你的寫法好清楚喔!我覺得自己想得好複雜」
「沒關係呀!會隨著經驗越寫越清楚的。你對 Kotlin 的 Collection 越來越熟悉了耶!還會用 toMutableList()
」
「對呀!聖佑的這本《Kotlin Collection 全方位解析攻略 : 精通原理及實戰,寫出流暢好維護的程式》 寫得真好,希望有一天可以見到他本人向他學習。」
「說不定有機會喔,聽說他常常會出沒在 Kotlin Meetup 內,八月的 Kotlin Meetup #7 還是他本人講的呢!」
「哇!那我要多關注一下這個活動了。」
「看兩位聊得那麼開心,都寫完了嗎?那我們再多一題看看?」夏天開啟了 217. Contains Duplicate
這題比較難一點,兩人不禁皺起了眉頭,開始思考
「感覺好像可以用迴圈處理,可是這樣還要用另一個陣列去紀錄內容,有一點點麻煩」
「這題可以用 Kotlin 內建的 groupingBy
來簡化一些。來!我寫給兩位看看」夏天邊寫邊開始說明
「在 Kotlin 裡面,如果一個函數的最後一個參數,是接收另一個 lambda 函數的話,那麼就可以直接放在 {}
裡面。」
「那個⋯⋯請問 lambda 的意思是什麼?」曉欣害羞地問。
「沒關係,你就先把它當作一個普通的函數就好」夏天送出了以下的答案
class Solution {
fun containsDuplicate(nums: IntArray): Boolean
= nums.toList()
.groupingBy { it }
.eachCount()
.any { it.value > 1 }
}
「哇!夏天這樣寫好清楚喔!從來沒想過程式可以寫成這樣」
「對呀!這就是 Kotlin 的特性了。由於他的語法特性,程式很容易寫得非常簡潔」
「今天寫好幾題了,我們就先到這邊吧!」