iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0

雖然昨天說要擴大主題,但早上還是用習慣的題目來熱身會比較恰當,我是這麼想的。

於是找到了一個字串題目,125. Valid Palindrome要判斷去除掉標點符號後的句子是不是回文,也就是從前往後讀和從後往前讀是一樣的內容。

class Solution {
    fun isPalindrome(s: String): Boolean {
        val result = s.toLowerCase().replace("[^a-z]", "")
        println("$result")
        repeat(result.length / 2) {
            if (result[it] != result[result.lastIndex-it]) {
                return false
            }
        }
        return true
    }
}

看著學妹打的程式碼,我驚訝的說:「哎呀,居然不是直接用reversed方法來反轉比對啊。」

「因為reversed不是把整個字串都跑了一遍嗎?前前後後比對的話,只需要一半的迴圈。」學妹也開始有時間觀念了,甚好。

「啊,不過我還沒寫好啦,因為有問題,所以我正在查。」

「難怪妳用了println方法。」

「對呀,幸好println方法在Leetcode也能用,我一看stdout格子就知道問題是出在正規式沒正常工作。」

截圖 2022-09-22 下午9 16 28

「嗯,我看看,先全部小寫,再用^這個否定所有英文小寫。嗯,這樣寫應該會把所有非英文的字都拿掉的。啊,試試加上.toRegex()如何?也許被誤認成普通字串了,用這個可以強制認知成正規式。」

「啊!可以了!」學妹發出喜悅的聲音。

不過為防萬一,測試前我們還是按了Use Example Testcases加上所有範例,畢竟一開始的預設值只有第一個範例。

截圖 2022-09-22 下午9 16 43

確認三個範例都通過後學妹送出了答案,沒想到電腦瞬間就發出了高分貝的警鈴聲,浴室也傳來氣勢磅礡的水聲!

出錯了嗎!

「我去關水,學姊妳幫忙找一下錯誤!」學妹說著就跑向浴室。

我慌亂的檢查導致出錯的案例。

截圖 2022-09-22 下午9 13 18

"0P"?拿掉數字的確是回文啊?等等,我看看題目,啊,Alphanumeric characters include letters and numbers.,原來數字不用拿掉嗎!」

「學姊!水關不掉!而且因為沒有排水孔的關係,水已經開始往浴室外面淹了!」

「什麼!」我嚇得聲音都尖起來。「那妳趕快過來改答案!」

學妹聽了馬上往我這邊走,但是沒走幾步就突然停下腳步,瞪著我說:「學姊,電腦是不是飄起來了?」

「什麼,別開玩笑了,趕快過來!」水都淹到小腿了還發什麼呆。

「不是玩笑,學姊妳轉頭看啊!」

我猛地轉頭,臉差點撞到螢幕,等等,我現在是站著的,螢幕怎麼會撞到我臉?

我低頭一看,整台電腦都不在原本的位置了。

「是不是電腦為了避開水才往上飄啊?」學妹猜測。

啊,的確,如果沒有往上移動的話,電腦已經泡水了。

但是繼續往上飄的話,最後就碰不到了!

學妹彷彿也想起了這點,匆匆地往這邊移動,但是因為水流,靠近的速度無法加快。

我左右看看有沒有可以利用的東西,看到了那張矮桌。

我使勁把它直立起來,如我所想,這張桌子的高度雖然離天花板有段距離,但是也已經比我高上許多。

高度是足夠了,可是學妹要怎麼爬上去?

而且上面還有之前的杯子和碗。

對了!那些杯子和碗!

學妹終於掙扎著到了我身邊。

「學姊,現在怎麼辦?」

「學妹,妳玩過抱石嗎?等一下妳就沿著我的杯子和碗上去。我剛剛已經調整過位置了。」

「哈?」學妹愣了一下反應過來。「對喔!那些碗盤只有妳可以移動。」

之前我本來想把自己的牛奶送給學妹,結果發現她不能動我的杯子;反之,我也不能動她的杯子。碗也是一樣。

學妹抓著杯子,確認非常穩固後,攀上去之前問了我一聲:「學姊玩過抱石嗎?」

「沒有,但是有看過抱石動畫,大概知道原理?」

「那算什麼,我看了駭客電影也沒學到駭客技術啊。」學妹吐槽。

「學妹妳莫非是因為憧憬駭客才進我們系的吧。」儘管在這種緊張的時候,我還是忍不住笑了。

「⋯⋯不行嗎?」學妹不甘願地承認。

「沒什麼不行,趕快上去將正規式從非英文[^a-z]的規則,改成非英文非數字的[^a-z0-9]。就算我會游泳,也不想一直泡在水裡呀。」

學妹沒再回嘴,爬到了適合的高度一手支撐著身子,一手修改程式碼。

我仰躺在水面上,看著越來越近的天花板,想著學妹的打字速度應該要加強的時候,終於水面停止上漲。

class Solution {
    fun isPalindrome(s: String): Boolean {
        val result = s.toLowerCase().replace("[^a-z0-9]".toRegex(), "")
        repeat(result.length / 2) {
            if (result[it] != result[result.lastIndex-it]) {
                return false
            }
        }
        return true
    }
}

上一篇
Day15: 陣列對應轉換map方法
下一篇
Day17: 時刻和駭客鬥爭的資訊安全
系列文
不解題就不能離開的房間31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言