NOWCODER考研机试专题

5. 手机键盘

2018-12-30  本文已影响0人  IceFrozen
题目描述

按照手机键盘输入字母的方式,计算所花费的时间 如: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
题目的要求归纳为两点:

则在不考虑等待时间的情况下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;
}
上一篇 下一篇

猜你喜欢

热点阅读