写点什么

【LeetCode】键盘行 Java 题解

用户头像
HQ数字卡
关注
发布于: 4 小时前

题目描述

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


美式键盘 中:


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


示例 1:
输入:words = ["Hello","Alaska","Dad","Peace"]输出:["Alaska","Dad"]
示例 2:
输入:words = ["omk"]输出:[]
示例 3:
输入:words = ["adsdf","sfd"]输出:["adsdf","sfd"]
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/keyboard-row著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码

思路分析

  • 今天的算法每日一题是字符串数组处理题目,题意简单明了。

  • 整体思路是为每一个英文字母标记其对应键盘上的行号,然后检测字符串中所有字符对应的行号是否相同。

  • 在实现代码中,首先预处理计算出每个字符对应的行号。这里可以采用 ASCII 码的知识,ASCII 码是最通用的信息交换标准。简单理解就是将字符转换成数字记录。方便后续使用,快速判断字符属于哪一行。

  • 在代码执行的细节中,由于同一字母的大写字母,小写字母都对应的是同一个键盘位置,我们可以简化操作,统一转换成小写字母进行判断。具体实现如下:

通过代码

class Solution {    public String[] findWords(String[] words) {        String[] temp = new String[]{"qwertyuiop","asdfghjkl","zxcvbnm"};        int[] chars = new int[26];        int i = 1;        for (String s : temp) {            for (char c : s.toCharArray()) {                chars[c - 'a'] = i;            }            i++;        }        
List<String> list = new ArrayList<>();
for (String word : words) { int j = -1; boolean flag = true; for (char wordChar : word.toCharArray()) { wordChar = Character.toLowerCase(wordChar); if (j == -1) { j = chars[wordChar - 'a']; } else if (j != chars[wordChar - 'a']) { flag = false; break; } } if (flag) { list.add(word); } }

String[] ans = new String[list.size()]; for (int k = 0; k < list.size(); k++) { ans[k] = list.get(k); }
return ans; }}
复制代码



总结

  • 上述算法的时间复杂度是 O(n * n), 空间复杂度是 O(n)

  • 今天的每日一题题目简单明了,但是实际实现,并且通过测试,大家可以实际尝试一下。纸上得来终觉浅,绝知此事要躬行!多多写代码,才有助于我们更好的提高!

  • 坚持算法每日一题,加油!

发布于: 4 小时前阅读数: 5
用户头像

HQ数字卡

关注

还未添加个人签名 2019.09.29 加入

LeetCode,略懂后端的RD

评论

发布
暂无评论
【LeetCode】键盘行Java题解