「夏姐!今天先等一下喔」菁菁開心的說
「嗯?」夏天嚇了一跳,難得今天的分享不是以自己打開題目開場。
「嘿嘿,我跟曉欣後來發現了,原來 leetcode 有一個『Similar Questions』的功能,所以我們自己嘗試解了幾題」菁菁跟曉欣打開了之前的答題紀錄:
class Solution {
fun fourSum(nums: IntArray, target: Int): List<List<Int>> {
val set = HashSet<List<Int>>()
nums.sort()
for (i in 0 until nums.size - 3) {
for (j in i + 1 until nums.size - 2) {
var left = j + 1
var right = nums.size - 1
while (left < right) {
val sum = nums[i] + nums[j] + nums[left] + nums[right]
when {
sum == target -> {
set.add(listOf(nums[i], nums[j], nums[left], nums[right]))
left++
right--
}
sum < target -> left++
else -> right--
}
}
}
}
return set.toList()
}
}
「哇!這題你們怎麼想出來的!」
「沒有啦⋯⋯主要還是菁菁想到,其實這題跟 2 sum 有關。只要連續做兩次 2 sum 的邏輯,就差不多了」曉欣害羞的說。
雖然這樣說大致上也沒錯,4 sum 這題目其實還有很多細節需要考慮,從程式碼就可以看出兩人嘗試錯誤的痕跡。想到不知道兩人私下究竟花了多少時間,夏天不禁有點感動。
「還有這題」曉欣打開了另一題的紀錄
class Solution {
fun intToRoman(num: Int): String {
val romanList = listOf(
1000 to "M",
900 to "CM",
500 to "D",
400 to "CD",
100 to "C",
90 to "XC",
50 to "L",
40 to "XL",
10 to "X",
9 to "IX",
5 to "V",
4 to "IV",
1 to "I"
)
var number = num
var index = 0
var str = ""
while (number != 0) {
if (number >= romanList[index].first) {
val romanValue = romanList[index]
number -= romanValue.first
str += romanValue.second
} else {
index++
}
}
return str
}
}
要從原本的 13. Roman to Integer 推想出這題的解法,私下不知道花了多少時間。而且看得出曉欣現在對 Kotlin Collection 的掌握度,很可能比起一些剛學 Kotlin 的工程師還要好。
「今天本來想跟兩位介紹 linked list 這個資料結構的」 夏天打開原本為今天準備的題目 206. Reverse Linked List
「這跟 tree 很像耶」兩人看了一下註解的部分
/**
* Example:
* var li = ListNode(5)
* var v = li.`val`
* Definition for singly-linked list.
* class ListNode(var `val`: Int) {
* var next: ListNode? = null
* }
*/
「其實⋯⋯嗯,其實差不多」本來想糾正兩人觀念的夏天,突然覺得好像也沒必要多說。反正以兩人自學的速度,他們很快就會找到對 linked list 的說明文章了。
兩人花了一點時間,寫出下面的解答
class Solution {
fun reverseList(head: ListNode?): ListNode? {
var reversed: ListNode? = null
var current = head
while(current != null) {
val temp = ListNode(current.`val`)
temp.next = reversed
reversed = temp
current = current.next
}
return reversed
}
}
「兩位太厲害了!」夏天非常開心。「那我順便分享一下 Kotlin Scope function 的用法」
class Solution {
fun reverseList(head: ListNode?): ListNode? {
var reversed: ListNode? = null
var current = head
while (current != null) {
reversed = ListNode(current.`val`)
.apply { next = reversed }
.also { current = current!!.next }
}
return reversed
}
}
「原來 Kotlin scope function 可以這樣用呀」看到 scope function 的用法,兩人不禁感嘆
「沒問題的,相信你們兩位很快就能學會的」夏天有信心的說