题目描述
按照手机键盘输入字母的方式,计算所花费的时间 如:a,b,c都在“1”键上,输入a只需要按一次,输入c需要连续按三次。 如果连续两个字符不在同一个按键上,则可直接按,如:ad需要按两下,kz需要按6下 如果连续两字符在同一个按键上,则两个按键之间需要等一段时间,如ac,在按了a之后,需要等一会儿才能按c。 现在假设每按一次需要花费一个时间段,等待时间需要花费两个时间段。 现在给出一串字符,需要计算出它所需要花费的时间。
输入描述:
一个长度不大于100的字符串,其中只有手机按键上有的小写字母
输出描述:
输入可能包括多组数据,对于每组数据,输出按出Input所给字符串所需要的时间
示例1
输入
bob
www
输出
7
7
思路
手机键盘的结构为:abc, def, ghi, jkl, mno, pqrs, tuv, wxyz
题目的要求归纳为两点:
- 连续两次不在一个按键可以直接按;
- 连续两次同一个按键需要等待2个时间段
则在不考虑等待时间的情况下a~z每个小写字母的按键次数分别为
times[26] = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4}
接下来考察什么情况会出现等待时间,连续按相同按键时即会出现等待时间,于是问题变成了怎么判断是否连续按相同按键,于是将相同按键上的字母用相同的数字表示,即a~z对应
same[26] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8}
对于输入的字符串,每个字符减去 'a' 的 ASCII 码即对应上了上述数组
解法
#include<stdio.h>
#include<string.h>
int main(){
char str[100]; //待输入的字符串
int res = 0; //输出的结果
int times[26] = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4}; //每个字母的按键次数
int same[26] = {1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8}; //同一个按键上的字母数字相同
while(gets(str) != NULL){
for(int i = 0; i < strlen(str); i++){
res += times[str[i] - 'a'];
if(i > 0)
if(same[str[i] - 'a'] - same[str[i -1] - 'a'] == 0) //从第二个字母开始,如果和前一个是相同按键,加2时间
res += 2;
}
printf("%d\n", res);
}
return 0;
}
网友评论