leetCode 260打卡记录2021.10.30

500 键盘行(简单题)

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

美式键盘 中:

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

leetCode 260打卡记录2021.10.30

2.解题思路

  1. 将所有数字分为三组,分组标准为 该字母所在行数 ,比如说‘a’在第二行,‘z’在第三行。然后将所有字母按a-z的顺序,将他们的行数整合成一个字符串。也就是(0代表第一行,依次类推):
“12210111011122000010020202”
  1. 遍历题目给出的每一个字符串。
  2. 在遍历过程中,先提取出每个字符串的第一个字符,得出该字符的行数(重点)。
  3. 得出行数后,开始遍历该字符串的每一个字符,得出该字符的行数,再和该字符串的第一个字符的行数比对,如果相同,则继续遍历,直到结束,也就意味着该字符串属于同一行;如果不同,则break。开始遍历下一个处理下一个字符串。
  • 关于如何得出字母的行数:
      首先将该字母小写化(tolower(char))
      再求与’a’的差  tolower(char)-‘a’
      在根据这个下标,找到前面说的行数字符串,找到为该下标的值。即:
str[tolower(word[0])-'a'];

3.代码

class Solution {
public:
    vector<string> findWords(vector<string>& words) {
        vector<string> return_str;
        string str="12210111011122000010020202";
        for(string &word : words){
            bool flag=true;
            //判定第一个字符为哪一行的
            char temp=str[tolower(word[0])-'a'];
            for(int i=1;i<word.size();i++){
                if(str[tolower(word[i])-'a']!=temp){
                    flag=false;
                    break;
                }
            }
            if(flag){
                return_str.emplace_back(word);
            }
        }
        return return_str;
    }
};
上一篇:有什么方法判断网站后台是用什么语言写的


下一篇:转换大小写