[LeetCode]每日一题:500. 键盘行

125 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情

500. 键盘行

给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。

美式键盘 中:

第一行由字符 "qwertyuiop" 组成。 第二行由字符 "asdfghjkl" 组成。 第三行由字符 "zxcvbnm" 组成。

「示例1:」
输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]
「示例2:」
输入:words = ["omk"]
输出:[]
「示例3:」
输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]
「示例4:」
输入:words = ["top","bottom","left","right"]
输出:["top"]
「示例5:」
输入:words = ["red","green","white","black"]
输出:[]
「提示:」
1. 1 <= words.length <= 20
2. 1 <= words[i].length <= 100
3. words[i] 由英文字母(小写和大写字母)组成

解题思路

首先我们可以使用 filter 方法来遍历筛选数组,当内部函数调用返回结果为 true 时,才会被放入最终返回的结果集里面
​
其次采用字符串的 toLowerCase 方法将每一个字符串统一转化为小写
​
再通过 Set 方法过滤掉重复的数据
​
通过拓展运算符,展开每一个字符串,这一步得到的 lowerWord 是小写单字符数组
​
利用 every 判断数组中的每一项是否在键盘字母中,如果通过 indexOf 返回的值 大于 -1,说明当前判断的这个字母在这一行内 every 方法,只有当全部为 true 时才返回 true,因此这个返回的数组中,最多只有一个为 true
​
有为 true 的,就说明能够找到,这个单词符合题意,这里就采用了 some 方法来遍历,有 truetrue
​
由于 filter 返回的是过滤后的数组,因此此题结束

代码实现

/**
 * @param {string[]} words
 * @return {string[]}
 */
var findWords = function(words) {
    const result = words.filter(item => {
        const lowerWords = [...new Set(item.toLocaleLowerCase())];
​
        return [
            lowerWords.every(
                item => 'qwertyuiop'.indexOf(item) !== -1
            ),
            lowerWords.every(
                item => 'asdfghjkl'.indexOf(item) !== -1
            ),
            lowerWords.every(
                item => 'zxcvbnm'.indexOf(item) !== -1
            ),
        ].some(item => item);
    })
​
    return result;
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;