iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0
Software Development

不解題就不能離開的房間系列 第 18

Day18: 普通的工程師遵守法則,厲害的工程師利用法則!

  • 分享至 

  • xImage
  •  

「而且電影裏的駭客的臨場反應可是快而不亂。」我見學妹越來越萎靡不振,有點不忍。「也不用這樣氣餒啦,可以試試開發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()

因為這兩個數學函式回傳的結果不是整數,而是帶小數的浮點數。

而像學妹這樣直接用迴圈計算,會利用到程式資料的特性——整數運算後還是整數,自動捨棄小數點後的值。

在某些時候是缺點的特性,在這個時候反而成了優點,這也是運算邏輯的有趣之處。

普通的工程師遵守法則,厲害的工程師利用法則!


上一篇
Day17: 時刻和駭客鬥爭的資訊安全
下一篇
Day19: 數字儲存空間
系列文
不解題就不能離開的房間31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言