5. 手机键盘

作者: IceFrozen | 来源:发表于2018-12-30 20:22 被阅读0次
    题目描述

    按照手机键盘输入字母的方式,计算所花费的时间 如: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;
    }
    

    相关文章

      网友评论

        本文标题:5. 手机键盘

        本文链接:https://www.haomeiwen.com/subject/jvzvlqtx.html