今天我們來看 1. Two Sum 這一題
「這題可以用雙重迴圈做出來」兩位很快的做出了解答
class Solution {
fun twoSum(nums: IntArray, target: Int): IntArray {
nums.forEachIndexed { i, _ ->
nums.forEachIndexed { j, _ ->
if (nums[i] + nums[j] == target && i != j) {
return intArrayOf(i, j)
}
}
}
return intArrayOf()
}
}
「嗯!這麼快就寫出解答,看得出你們私下也有好好練習寫程式喔!」夏天雖然剛剛病癒,但是看到曉欣和菁菁的進步,還是感到很開心。
「那接著,我來分享一個比較快速的方式,要用到 Hash
這個資料結構」
「Hash
?」兩人異口同聲的問
「對,菁菁你知道這個結構嗎?」
「之前大學大概有教過,簡單的說就是有一個 Key,透過 Key 去抓值會比迴圈快吧。可是,這跟這個題目有什麼關係呢?」
「咦,如果抓值會比迴圈快的話,那麼是不是就可以不用兩個迴圈?」曉欣雖然沒學過 Hash
,但是聽了兩人的討論,也嘗試猜看看怎麼做會更好。
「好像有道理,可是怎麼在第一次迴圈時,就知道該怎麼取值」兩人開始討論怎麼設計演算法。
夏天突然發現到,在生病不在的這段期間,兩人已經從一開始的生疏,到已經可以自動自發討論演算法的程度了。而且兩人也不再每次都需要自己提供解答。
「夏天姐!我們想到一個作法,可是我們不知道怎麼宣告 Hash
」曉欣說到
「啊!宣告的話,可以用 hashMapOf<Int, Int>()
」
「這樣啊,那我們試看看」兩位開始嘗試調整寫法
「成功了!」
class Solution {
fun twoSum(nums: IntArray, target: Int): IntArray {
val map = hashMapOf<Int, Int>()
nums.forEachIndexed { i, _ ->
if (map.containsKey(target - nums[i])) {
val tmp = map[target - nums[i]]!!.toInt()
return intArrayOf(tmp, i)
}
map[nums[i]] = i
}
return intArrayOf()
}
}
「看來,暫時因病請假一陣子,也不是全然是件壞事嘛」看到兩位自己解出題目開心的樣子,夏天暗暗想到。
「那這一題呢?」夏天打開 169. Majority Element
「這題好像要用到比較多 Collection 的技巧」曉欣邊翻著《Kotlin Collection全方位解析攻略 : 精通原理及實戰,寫出流暢好維護的程式》 邊和菁菁討論。夏天也從這次經驗中學習,學習著耐心等兩人討論,不直接給兩人答案。
經過幾次的編譯錯誤,和錯誤答案之後,兩人成功的解答出來。而且出乎夏天意外的,還是單一表達式的寫法
class Solution {
fun majorityElement(nums: IntArray) = nums
.toList()
.groupingBy{it}
.eachCount()
.map{ it ->
if(it.value > nums.size / 2){
it.key
}
else{
null
}
}
.toList()
.filterNotNull()[0]
}
「你們兩個太厲害了!」夏天開心的說