刷题日记-500. 键盘行

156 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

500. 键盘行

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

美式键盘 中:

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

image.png  

示例 1:

输入:words = ["Hello","Alaska","Dad","Peace"]
输出:["Alaska","Dad"]

示例 2:

输入:words = ["omk"]
输出:[]

示例 3:

输入:words = ["adsdf","sfd"]
输出:["adsdf","sfd"]

提示:

1 <= words.length <= 20 1 <= words[i].length <= 100 words[i] 由英文字母(小写和大写字母)组成

二、思路分析

  • 定义一个Map,保存字母对应的行(从0开始,第一行是0,第二行是1,第三行是2)
  • 第一行的值都是零,所以第一行就不用写到Map了
  • 避免大小写转换,在Map内把大写也加进去
  • 利用字符串数组初始化Map,字符串数组为[3]string{"", "asdfghjklASDFGHJKL", "zxcvbnmZXCVBNM"}
  • 剩下的就是计算每个word的每个单词在Map内的值是否相等
  • 使用continue label简化一下代码(两个循环,直接跳到外层循环继续)

三、AC 代码

func findWords(words []string) []string {
	m := map[byte]int{}
	strs := []string{"", "asdfghjklASDFGHJKL", "zxcvbnmZXCVBNM"}
	for i, str := range strs {
		for j := range str {
			m[str[j]] = i
		}
	}
	ans := []string{}
LOOP:
	for _, word := range words {
		n := m[word[0]]
		for i := 1; i < len(word); i++ {
			if m[word[i]] != n {
				continue LOOP
			}
		}
		ans = append(ans, word)
	}
	return ans
}

四、总结

理解题意之后进行简单的模拟即可。

范文参考

【ACM金牌题解】简单模拟 | 编程熊 - 键盘行 - 力扣(LeetCode) (leetcode-cn.com)