九宫格输入法-字符串处理方法

之前做过九宫格输入法的题目

搜了一下网上的解法没找到高效的解法

写一个相对高效的解法

先放上原题

假设有九宫格输入法键盘布局如下:

 [ 1,.?! ] [ 2ABC ] [ 3DEF  ]
 [ 4GHI  ] [ 5JKL ] [ 6MNO  ]
 [ 7PQRS ] [ 8TUV ] [ 9WXYZ ]
		   [ 0空  ]
注意:中括号[ ]仅为了表示键盘的分隔,不是输入字符。
每个中括号中,位于首位的数字字符即是键盘的按键,按一下即可输入该数字字符。
多次按同一个键,则输入的字符依次循环轮流,例如按两次3,则输入D;
按5次7,则输入S;按6次2,则输入A。按键0的输入组合是0和空格字符,即按两次0输入空格。

你需要对于给定的按键组合,给出该组合对应的文本。

输入格式:
输入在一行中给出数个字符的按键组合(例如 999 表示按3次9),
每个字符的按键组合之间用空格间隔,最后一个输入法组合之后以换行结束。
输入数据至少包括一个字符的按键组合,且输入总长度不超过500个字符。

输出格式:
在一行中输出该按键组合对应的文本。

输入样例:
22 5555 22 666 00 88 888 7777 4444 666 44
输出样例:

ALAN TURING  

首先直接以数字读入肯定会爆 题中给出了总长度不超过500

一种很直接的思路是每次读一个字符,遇到空格做一个统计,然后根据统计的个数输出结果。

但既然每组输入都是相同的数字,那用字符串处理起来可能会更方便

这里放上我的算法

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 
 5 const string keys[10] = {
 6     "0 ",
 7     "1,.?!","2ABC","3DEF",
 8     "4GHI","5JKL","6MNO",
 9     "7PQRS","8TUV","9WXYZ",
10 };
11 
12 int main() {
13     string str;        
14     while (cin >> str) {        // 从流中读取输入信息
15         string key = keys[str[0] - '0'];    // 按键
16         int counts = (str.size() - 1) % key.size();    // 按下次数
17         cout << key[counts];    // 输出
18     }
19     return 0;
20 }

可以说是钻了题目的空子。

博客迁移到https://luotianqi777.github.io/
原文地址:https://www.cnblogs.com/bugcreator/p/11178543.html