「而且電影裏的駭客的臨場反應可是快而不亂。」我見學妹越來越萎靡不振,有點不忍。「也不用這樣氣餒啦,可以試試開發AI駭客,讓她實現妳的夢想。啊,但目前AI主流是用機器學習,要準備大量的資料搭配合適的演算法來訓練模型。」
「練習會有效果的對吧?」學妹突然開口。
「當然囉,要不然怎麼會有這種專門讓人練習演算法的網站呢。等妳有實力之後還能參加電腦程式設計競賽,像是SRMs、AC和Google Code Jam可是很有名的!SRMs除了線上比誰的演算法比較好以外,還能妨礙其他參賽者,很駭客吧?」我突然想起來很重要的一點:「不過因為是國際比賽,所以全都是英文喔。」
學妹的眼睛閃閃發亮。「我想參加那個比賽!我會努力的!」
「很好,水也退了。收拾一下就回來解題吧。」幸好這次的失敗似乎沒有對學妹造成陰影,接下來的日子還得讓她繼續解題呢。可不能因為一次失敗就畏首畏尾。
浴室有乾衣設備,濕掉的衣服很快就乾了。
我讓學妹做了和前個題目一樣要求判斷是否是回文,但是不能轉字串處理的題目9. Palindrome Number。
學妹這次很謹慎的完成題目,log10的結果和長度會相差一位數的地方也有注意到,左右兩側的數字則用除法和餘數取得。
class Solution {
fun isPalindrome(x: Int): Boolean {
return when {
x < 0 -> false
x < 10 -> true
x < 100 -> x % 11 == 0
x % 10 == 0 -> false
else -> {
var result = x
var log10 = 0
var pow10 = 1
while(result >= 10) {
log10++
pow10 *= 10
result /= 10
}
result = x
repeat((log10 + 1) / 2) {
if (result / pow10 != result % 10) return false
result %= pow10
result /= 10
pow10 /= 100
}
return true
}
}
}
}
在Kotlin裏,傳入的參數是val型態,所以要改動的時候必須另外設定一個變數result,這倒是和Java不太一樣呢。雖然有點麻煩,但也符合常理。
學妹大概不知道數學函式庫有log10和pow10的方法,但是在這裡使用數學函式其實更麻煩。
val log10 = Math.log10(x.toDouble()).toInt()
var pow10 = Math.pow(10.0, log10.toDouble()).toInt()
因為這兩個數學函式回傳的結果不是整數,而是帶小數的浮點數。
而像學妹這樣直接用迴圈計算,會利用到程式資料的特性——整數運算後還是整數,自動捨棄小數點後的值。
在某些時候是缺點的特性,在這個時候反而成了優點,這也是運算邏輯的有趣之處。
普通的工程師遵守法則,厲害的工程師利用法則!