LeetCode - 500 - 键盘行(keyboard-row)
一 目录
不折腾的前端,和咸鱼有什么区别
目录 |
---|
一 目录 |
二 前言 |
三 解题及测试 |
四 LeetCode Submit |
五 解题思路 |
六 进一步思考 |
二 前言
- 难度:简单
- 涉及知识:哈希表
- 题目地址:https://leetcode-cn.com/problems/keyboard-row/
- 题目内容:
给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。
键盘如下图所示。
示例:
输入: ["Hello", "Alaska", "Dad", "Peace"] 输出: ["Alaska", "Dad"]
注意:
你可以重复使用键盘上同一字符。你可以假设输入的字符串将只包含字母。
三 解题及测试
小伙伴可以先自己在本地尝试解题,再回来看看 jsliang 的解题思路。
- LeetCode 给定函数体:
/*** @param {string[]} words* @return {string[]}*/
var findWords = function(words) {};
根据上面的已知函数,尝试破解本题吧~
确定了自己的答案再看下面代码哈~
index.js
/*** @name 键盘行* @param {string[]} words* @return {string[]}*/
const findWords = (words) => {const rows = ['qwertyuiop','asdfghjkl','zxcvbnm'];return words.filter(word => {return rows.some(row => {return word.toLocaleLowerCase().split('').every(z => {return row.includes(z);});});});
};// const words = ['Hello', 'Alaska', 'Dad', 'Peace'];
const words = ['a', 'b'];
console.log(findWords(words));
node index.js
返回:
['a', 'b']
四 LeetCode Submit
返回目录
Accepted
* 22/22 cases passed (60 ms)
* Your runtime beats 91.26 % of javascript submissions
* Your memory usage beats 5.97 % of javascript submissions (33.9 MB)
五 解题思路
首先,这是道有意思的题,那么我们先意思意思:
/*** @name 键盘行* @param {string[]} words* @return {string[]}*/
const findWords = (words) => {const hash = [{ title: 'Q', index: 1 },{ title: 'W', index: 1 },{ title: 'E', index: 1 },{ title: 'R', index: 1 },{ title: 'T', index: 1 },{ title: 'Y', index: 1 },{ title: 'U', index: 1 },{ title: 'I', index: 1 },{ title: 'O', index: 1 },{ title: 'P', index: 1 },{ title: 'A', index: 2 },{ title: 'S', index: 2 },{ title: 'D', index: 2 },{ title: 'F', index: 2 },{ title: 'G', index: 2 },{ title: 'H', index: 2 },{ title: 'J', index: 2 },{ title: 'K', index: 2 },{ title: 'L', index: 2 },{ title: 'Z', index: 3 },{ title: 'X', index: 3 },{ title: 'C', index: 3 },{ title: 'V', index: 3 },{ title: 'B', index: 3 },{ title: 'N', index: 3 },{ title: 'M', index: 3 },]const result = [];for (let i = 0; i < words.length; i++) {if (words[i].length === 1) {result.push(words[i]);} else {for (let j = 0; j < words[i].length - 1; j++) {const prevIndex = hash.find(item => item.title === words[i][j].toUpperCase()).index;const nextIndex = hash.find(item => item.title === words[i][j + 1].toUpperCase()).index;if (prevIndex !== nextIndex) {break;}if (prevIndex === nextIndex && j === words[i].length - 2) {result.push(words[i]);}}}}return result;
};// const words = ['Hello', 'Alaska', 'Dad', 'Peace'];
const words = ['a', 'b'];
console.log(findWords(words));
然后,Submit 提交看下:
Accepted
* 22/22 cases passed (96 ms)
* Your runtime beats 7.28 % of javascript submissions
* Your memory usage beats 5.97 % of javascript submissions (35 MB)
还有更菜的吗,有木有!!!(⊙﹏⊙)b
最后,再菜也讲下思路:
- 定义哈希表,每个字母及其对应的行数。
- 遍历传进来的数组
words
,然后判断每个words
的长度,因为长度为 1 的,就是单独一行。 - 判断当前字母所在的行数和下一个字母所在的行数是否一致,如果不是,循环中断,如果直到数组倒数第二个(倒数第二和倒数第一),都是一致的话,那么这个单词就符合题目要求
- 返回最终结果
result
。
六 进一步思考
既然今天有时间,肯定希望多折腾,多学习,然后提升自己,那么,Let's go:
正则表达式
const findWords = (words) => {const regexp = /^([qwertyuiop]+|[asdfghjkl]+|[zxcvbnm]+)$/i;return words.filter(item => {return regexp.test(item);})
};
正则表达式的效率挺感人的:
Accepted
* 22/22 cases passed (52 ms)
* Your runtime beats 98.54 % of javascript submissions
* Your memory usage beats 53.73 % of javascript submissions (33.6 MB)
当然我这种正则渣渣,就算搞懂了也是打死写不出的了,下一个。
复合计算
const findWords = (words) => {const rows = ['qwertyuiop','asdfghjkl','zxcvbnm'];return words.filter(word => {return rows.some(row => word.toLocaleLowerCase().split('').every(z => row.includes(z)));});
};
Submit 提交:
Accepted
* 22/22 cases passed (64 ms)
* Your runtime beats 83.5 % of javascript submissions
* Your memory usage beats 25.37 % of javascript submissions (33.7 MB)
OK,比起正则和我的暴力破解来,这个是比较中规中矩的,怕小伙伴们看不清楚,这里我们整理了下,顺带讲讲它的解法:
const findWords = (words) => {const rows = ['qwertyuiop','asdfghjkl','zxcvbnm'];return words.filter(word => {return rows.some(row => {return word.toLocaleLowerCase().split('').every(z => {return row.includes(z);});});});
};
rows
存储键盘对应的三行。- 遍历
rows
和words
,每个word
转小写并且转数组后,判断单个word
的所有元素是否属于同一个row
。 - 条件 2 判断中只要有一个条件符合那就表明这个单词属于上述条件中的一个。
口说无凭惹人烦,咱们还是看数据:
- 数据为:
["Hello", "Alaska", "Dad", "Peace"]
Hello
转小写转数组:['h', 'e', 'l', 'l', 'o']
- 数组中的所有元素,
h
在rows[1]
,但是e
在rows[0]
,不符合全部值在同一个位置,排除 Alaska
转小写转数组:['a','l','a','s','k','a']
- 数组中的所有元素,都在
rows[1]
中,所以filter
后返回该值 - 循环往复……
最终得出答案。
业务中多写这种代码
filter
、some
、split
、every
、includes
……会让一些维护代码的菜鸡队友崩溃吧,如果数据再复杂点,估计一些比较牛的也琢磨不透吧~ /手动滑稽
不折腾的前端,和咸鱼有什么区别!
jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。
浪子神剑 会每天更新面试题,以面试题为驱动来带动大家学习,坚持每天学习与思考,每天进步一点!
扫描上方二维码,关注 jsliang 的公众号(左)和 浪子神剑 的公众号(右),让我们一起折腾!
jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
LeetCode - 500 - 键盘行(keyboard-row)相关推荐
- 【解题报告】Leecode 500. 键盘行——Leecode每日一题系列
今天是坚持每日一题打卡第七天 题目描述 给你一个字符串数组 words ,只返回可以使用在 美式键盘 同一行的字母打印出来的单词.键盘如下图所示. 美式键盘 中: 第一行由字符 "qwert ...
- Leetcode PHP题解--D25 500. Keyboard Row
500. Keyboard Row 题目链接 500. Keyboard Row 题目分析 给定一个字符串数组,返回那些所出现的字母在QWERTY键盘中同一行的字符串. 例如,单词hello中,字母h ...
- R语言ggplot2可视化:使用堆叠的条形图(Stacked Barplot)可视化每个数据行(row)的缺失值的情况(Visualizing missing data counts in rows)
R语言ggplot2可视化:使用堆叠的条形图(Stacked Barplot)可视化每个数据行(row)的缺失值的情况(Visualizing missing data counts in rows) ...
- pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数
pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数 目录 pandas使用apply函数:在dataframe数据行(row)上施加(apply)函数
- c语言代码大全500行,C语言职工档案管理系统 500多行代码1
<C语言职工档案管理系统 500多行代码1>由会员分享,可在线阅读,更多相关<C语言职工档案管理系统 500多行代码1(17页珍藏版)>请在人人文库网上搜索. 1.1程序的总体 ...
- 酷键盘 Midi Keyboard for Mac - MIDI钢琴键盘模拟器
酷键盘 Midi Keyboard 中文版是mac上一款非常实用的MIDI钢琴键盘模拟器,可以用来虚拟演奏教程.乐谱训练.音乐制作器等等,支持载入MIDI文件,可以帮助大家创建更加出色优美的钢琴旋律! ...
- 计算机开启时提示键盘错误,进入BIOS自检找不到键盘提示Keyboard error怎么办
有用户开机时候没有直接正常启动Windows,进入BIOS自检找不到键盘提示 Keyboard error,这种情况以物理原因为多,需要检查键盘是否有故障等,下面一起看看具体步骤! 故障现象:电脑在启 ...
- U3D如何调用Win10的触摸键盘Touch KeyBoard非屏幕键盘(OSK.exe)
最近一个项目要用到Windows的触摸键盘的功能,试过OSK屏幕键盘总感觉不怎么好用,试了下Win10自带的TabTip触摸键盘发现比较符合要求这里贴上U3D呼出和隐藏触摸键盘Touch KeyBoa ...
- JS 进阶: 深入理解键盘事件 Keyboard Event
JS 进阶: 深入理解键盘事件 Keyboard Event 文章目录 JS 进阶: 深入理解键盘事件 Keyboard Event 正文 1. 基础 API 2. 基础事件:keydown.keyu ...
最新文章
- (0062)iOS开发之Xcode自带单元测试UnitTest
- 理解Android系统的进程间通信原理------RPC机制
- [BZOJ 2427] 软件安装
- .NET独有的精巧泛型设计模式
- wwww harmonyos,【新版本发布】HarmonyOS 1.0.0.71(SP2)
- 为什么一个程序申请的内存有限制_为什么要做自己的小程序商城,做一个要多久?...
- [Alfred]为Baidu Weather Workflow更新图标
- Sublime Text 3 快捷键总结(简洁版本)
- C#LeetCode刷题-广度优先搜索
- Jmeter工作原理
- 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。
- openstack nova 源码分析4-nova目录下的driver.py
- 导 Kinect2库,opencv库,pcl库
- php 防微信照片上传,PHP仿微信多图片预览上传功能
- 程序员面对分歧和难题应当具备的态度
- xp谷歌浏览器时间快了_Win7系统零日漏洞曝光,谷歌建议:升级Windows 10
- php验证码图片不显示怎么办,php 验证码图片无法显示怎么办
- js 网页烟花效果
- 怎么做用户流失召回,提升用户留存率
- Kernel源码笔记之调度:3.CFS
热门文章
- 第16周项目3--用函数指针调用函数(吃饭,睡觉,打豆豆)
- html如何让文字图片同高,css里图片和文字如何等高
- Android 打造炫目的圆形菜单 秒秒钟高仿建行圆形菜单
- 1000瓶无色无味的药水,其中有一瓶毒药,10只小白鼠拿过来做实验。喝了无毒的药水第二天没事儿,喝了有毒的药水后第二天会死亡。如何在一天之内(第二天)找出这瓶有毒的药水?
- Spring Boot进销存管理系统
- 15个WordPress幻灯片画廊插件
- iOS App上架AppStore 会遇到的坑
- 浅析文本挖掘(jieba模块的应用)
- Sublime text 3(ST3) - Source Insight
- 滴滴云A100 40G 性能测试 V100陪练!