持续创作,加速成长!这是我参与「掘金日新计划 · 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 方法来遍历,有 true 则 true
由于 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;
};
如果你对这道题目还有疑问的话,可以在评论区进行留言;