「這幾天寫陣列的題目,還算是有趣吧?」
「對呀!從陣列內學到了很多有趣的作法」看得出曉欣在家裡練習時,又重複看了很多次《Kotlin Collection全方位解析攻略 : 精通原理及實戰,寫出流暢好維護的程式》這本書。
「今天我們來嘗試這一題看看」夏天邊說,邊打開了 9. Palindrome Number 這題
「嗯⋯⋯如果用數學的方式去算,也不是算不出來,可是感覺好麻煩。」
「那我們來嘗試一個新的資料結構:字串。簡單的說,你可以將字串當作是處理一段文字。在 Kotlin 裡面,如果是一段文字的話,那將這段文字反轉過來,可以直接使用 reversed()
」
「那這樣的話,不就很簡單嗎?」菁菁邊說邊寫出答案
class Solution {
fun isPalindrome(x: Int): Boolean {
return x.toString().reversed() == x.toString()
}
}
「菁菁不對啦!還有負數的狀況呀」「對耶!原來如此」
class Solution {
fun isPalindrome(x: Int): Boolean {
if (x < 0) {
return false
}
return x.toString().reversed() == x.toString()
}
}
「沒錯!兩位配合的越來越好了!」
「謝謝老師⋯⋯不是,謝謝夏姐誇獎。」
「當然了,還可以這樣寫」
class Solution {
fun isPalindrome(x: Int) = when {
x < 0 -> false
else -> x.toString().reversed() == x.toString()
}
}
「既然前面這題這麼快就寫出來了,那麼這一題應該也不是什麼難事」夏天打開 7. Reverse Integer
兩位討論了一陣,很快地寫出了解答
class Solution {
fun reverse(x: Int): Int {
val ret = if (x < 0) {
(x * -1L).toString().reversed().toLong() * -1
} else {
x.toString().reversed().toLong()
}
return ret.toInt()
}
}
送出答案之後,曉欣很疑惑是哪邊錯了。菁菁倒是很快地察覺到了問題。
「啊!題目有特別提到:If reversing x causes the value to go outside the signed 32-bit integer range [-2^31, 2^31 - 1]
, then return 0」
「這個是什麼意思呀?」曉欣不解地問。
「有時候一個數字原本很小,翻轉過之後可能會變大很多。像是 1119
翻轉之後變成 9111
這樣。如果一個數字翻轉後超過 2^31
,那我們就要回傳 0
」菁菁開始修改答案
class Solution {
fun reverse(x: Int): Int {
val ret = if (x < 0) {
(x * -1L).toString().reversed().toLong() * -1
} else {
x.toString().reversed().toLong()
}
return if (ret > 0x7fffffff || ret < -0x7fffffff) 0 else ret.toInt()
}
}
「原來如此!寫程式要注意的細節好多!」
「對呀!字串是不是挺有趣的?」夏天笑著說
「感覺跟 Collection 有點像!一樣可以做 reversed()
之類的操作」
「不只是可以做 reversed()
喔!」夏天開啟了新題目: 1108. Defanging an IP Address
「這題的話,可以用 replace()
這個函數很快的做出來」
class Solution {
fun defangIPaddr(address: String) =
address.replace(".","[.]")
}
「今天新學字串這個資料格式,先讓兩位消化一下,之後還有很多好玩的題目!」