Recca Chao 的 gitHub page

推廣網站開發,包含 Laravel 和 Kotlin 後端撰寫、自動化測試、讀書心得等。Taiwan Kotlin User Group 管理員。

View on GitHub

Kotlin Leetcode - 500. Keyboard Row

題目連接

class Solution {
    fun findWords(words: Array<String>): Array<String> {
        
    }
}

解題思路

這一題是用陣列的方式處理許多字串

利用 map() filter()distinct()

雖然前面需要花費一些時間

設置鍵盤上字母位置的資料

整體的邏輯其實並不複雜

Kotlin 參考解答

class Solution {
    fun findWords(words: Array<String>): Array<String> {
        val firstRow = listOf(
            "q", "w", "e", "r", "t", "y", "u", "i", "o", "p",
            "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P",
            "{", "}", "|", "[", "]", "\\"
        )
        val secondRow = listOf(
            "a", "s", "d", "f", "g", "h", "j", "k", "l",
            "A", "S", "D", "F", "G", "H", "J", "K", "L",
            ":", "\"", "'", ";"
        )
        val thirdRow = listOf(
            "z", "x", "c", "v", "b", "n", "m",
            "Z", "X", "C", "V", "B", "N", "M",
            "?", "/", ",", ".", "<", ">"
        )
        return words
            .map { it ->
                val b = it
                    .split("")
                    .filter { it != "" }
                    .map {
                        when {
                            firstRow.contains(it) -> 1
                            secondRow.contains(it) -> 2
                            thirdRow.contains(it) -> 3
                            else -> 4
                        }
                    }
                    .distinct()
                if (b.size == 1) it
                else ""
            }.filter { it != "" }
            .toTypedArray()
    }
}

當然,由於 leetcode 題目的屬性

我們可以改回傳 List<String>

這樣就不用作 toTypedArray() 的處理

class Solution {
    fun findWords(words: Array<String>): List<String> {
        val firstRow = listOf(
            "q", "w", "e", "r", "t", "y", "u", "i", "o", "p",
            "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P",
            "{", "}", "|", "[", "]", "\\"
        )
        val secondRow = listOf(
            "a", "s", "d", "f", "g", "h", "j", "k", "l",
            "A", "S", "D", "F", "G", "H", "J", "K", "L",
            ":", "\"", "'", ";"
        )
        val thirdRow = listOf(
            "z", "x", "c", "v", "b", "n", "m",
            "Z", "X", "C", "V", "B", "N", "M",
            "?", "/", ",", ".", "<", ">"
        )
        return words
            .map { it ->
                val b = it
                    .split("")
                    .filter { it != "" }
                    .map {
                        when {
                            firstRow.contains(it) -> 1
                            secondRow.contains(it) -> 2
                            thirdRow.contains(it) -> 3
                            else -> 4
                        }
                    }
                    .distinct()
                if (b.size == 1) it
                else ""
            }.filter { it != "" }
    }
}

回到 leetcode 列表