这是悦乐书的第245次更新,第258篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第112题(顺位题号是500)。给定一个单词列表,返回可以在美国键盘的一行上使用字母表键入的单词,如下图所示。



例如:

输入:["Hello","Alaska","Dad","Peace"]

输出:["Alaska","Dad"]

注意:

  • 您可以多次使用键盘中的一个字符。

  • 您可以假设输入字符串仅包含字母。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

题目的意思是从一个字符串数组中找出只由某一行字母(有3行字母)组成的字符串,并且作为字符串数组输出。

对此,我们可以将每一行的字母作为key,行号为value,存入HashMap中。然后我们遍历字符串数组中的元素,获取到当前字符串,得到其第一个字符所在行号,然后依次判断剩下字符所在行号,如果和第一个字符所在行号不相等,就将行号重新赋值,如果遍历完剩下的字符行号不变,就将其添加进list中,最后将list转为字符串数组作为结果输出。

public String[] findWords(String[] words) {
List<String> list = new ArrayList<String>();
Map<Character, Integer> map = new HashMap<Character, Integer>();
String s1 = "qwertyuiopQWERTYUIOP";
String s2 = "asdfghjklASDFGHJKL";
String s3 = "zxcvbnmZXCVBNM";
for (char ch : s1.toCharArray()) {
map.put(ch, 1);
}
for (char ch : s2.toCharArray()) {
map.put(ch, 2);
}
for (char ch : s3.toCharArray()) {
map.put(ch, 3);
}
for (int i=0; i<words.length; i++) {
String ss = words[i];
int floor = map.get(ss.charAt(0));
for (char ch : ss.toCharArray()) {
if (floor != map.get(ch)) {
floor = map.get(ch);
break;
}
}
if (floor == map.get(ss.charAt(0))) {
list.add(ss);
}
}
return list.toArray(new String[list.size()]);
}

03 第二种解法

针对第一种解法,我们可以使用数组进行替代,这样更轻便一些。

依旧是那三行字符组成的字符串,存入一个数组中,然后遍历words中的元素,拿到当前字符串后,借助一个额外的方法getRowNum来获取某一字符所在的行号,然后判断该字符串剩下的字符,是否依旧存在于该行号所在字符串中,全都存在就将其添加进list中,最后将其转为字符串数组作为结果输出。

private String[] keyString = {"qwertyuiopQWERTYUIOP", "asdfghjklASDFGHJKL", "zxcvbnmZXCVBNM"};

public String[] findWords2(String[] words) {
List<String> list = new ArrayList<String>();
for (int i=0; i<words.length; i++) {
int currentRow = getRowNum(words[i].charAt(0));
boolean flag = true;
for (char ch : words[i].toCharArray()) {
if (keyString[currentRow].indexOf(ch) == -1) {
flag = false;
}
}
if (flag) {
list.add(words[i]);
}
}
return list.toArray(new String[list.size()]);
} public int getRowNum (char ch) {
for (int i=0; i<keyString.length; i++) {
if (keyString[i].indexOf(ch) != -1) {
return i;
}
}
return -1;
}

04 第三种解法

还有更加疯狂的解法,一行代码搞定。

public String[] findWords3(String[] words) {
return Stream.of(words).filter(s -> s.toLowerCase().matches("[qwertyuiop]*|[asdfghjkl]*|[zxcvbnm]*")).toArray(String[]::new);
}

05 小结

算法专题目前已日更超过三个月,算法题文章112+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Keyboard Row(Java实现)的更多相关文章

  1. LeetCode算法题-Heaters(Java实现)

    这是悦乐书的第239次更新,第252篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第106题(顺位题号是475).冬天来了!您在比赛期间的第一份工作是设计一个固定温暖半径 ...

  2. LeetCode算法题-Sqrt(Java实现)

    这是悦乐书的第158次更新,第160篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69). 计算并返回x的平方根,其中x保证为非负整数. 由于返回类型 ...

  3. leetcode算法: Keyboard Row

    Given a List of words, return the words that can be typed using letters of alphabet on only one row' ...

  4. LeetCode算法题-Image Smoother(Java实现)

    这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...

  5. LeetCode算法题-Reshape the Matrix(Java实现)

    这是悦乐书的第264次更新,第277篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第131题(顺位题号是566).在MATLAB中,有一个非常有用的函数叫做'reshap ...

  6. LeetCode算法题-Magic Squares In Grid(Java实现)

    这是悦乐书的第326次更新,第349篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第196题(顺位题号是840).3 x 3魔方是一个3 x 3网格,填充了从1到9的不同 ...

  7. LeetCode算法题-Flipping an Image(Java实现)

    这是悦乐书的第324次更新,第347篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第194题(顺位题号是832).给定二进制矩阵A,我们想要水平翻转图像,然后反转它,并返 ...

  8. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  9. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

随机推荐

  1. Linux下python2和python3共存

    python下载地址: https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tar.xz 下载命令: wget https://www.pytho ...

  2. Python内置函数(36)——iter

    英文文档: iter(object[, sentinel]) Return an iterator object. The first argument is interpreted very dif ...

  3. 概率分布之间的距离度量以及python实现(三)

    概率分布之间的距离,顾名思义,度量两组样本分布之间的距离 . 1.卡方检验 统计学上的χ2统计量,由于它最初是由英国统计学家Karl Pearson在1900年首次提出的,因此也称之为Pearson ...

  4. 实现网站页面的QQ临时会话,分享到空间微博等按钮.

    一 qq临时会话 要实现qq临时会话首先要到qq在线状态官网开通qq在线状态,其中临时对话也分为加密和未加密. 1.1:加密模式 <a target="_blank" hre ...

  5. mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制)

    一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在一定的延时,这样存在一个隐患:当主库上写入一个事务并提交成功,而从库尚未得到主库推送的Binlog日志时,主库 ...

  6. 使用mpvue开发小程序教程(六)

    在上一章节中,我们列举了在Vue中能用但在mpvue中不能用或需要特别注意的特性,在实际开发前了解一下还是很有必要的,可以避免浪费找错误的时间. 如果你使用过原生的小程序框架,你一定经历过或思考过怎么 ...

  7. keepalived+双主实践HA

    工作不怎么忙,搞点儿开发吧差点儿事,就想着弄点儿架构的事儿.正好前段时间看过关于keepalived+双主实现高可用的文章,也恰好身边的朋友所在的公司也部分用这个架构.没什么事儿就搞搞吧,正好对比下M ...

  8. 【c#】RabbitMQ学习文档(二)Work Queues(工作队列)

        今天开始RabbitMQ教程的第二讲,废话不多说,直接进入话题.   (使用.NET 客户端 进行事例演示)          在第一个教程中,我们编写了一个从命名队列中发送和接收消息的程序. ...

  9. JVM(五)垃圾回收器的前世今生

    全文共 2195 个字,读完大约需要 8 分钟. 如果垃圾回收的算法属于内存回收的方法论的话,那本文讨论的垃圾回收器就属于内存回收的具体实现. 因为不同的厂商(IBM.Oracle),实现的垃圾回收器 ...

  10. selenium加载配置参数,让chrome浏览器不出现‘Chrome正在受到自动软件的控制’的提示语,以及后台静默模式启动自动化测试,不占用桌面的方法

    一:自动化测试的时候,启动浏览器出现‘Chrome正在受到自动软件的控制’,怎么样隐藏,今天学习分享: 在浏览器配置里加个参数,忽略掉这个警告提示语,disable_infobars option = ...