题解 | 手机键盘

手机键盘

https://www.nowcoder.com/practice/20082c12f1ec43b29cd27c805cd476cd

//典型的模拟问题
//思路:设置两个map,第一个map存放字母和字母的输入时间;第二个map存放字母和字母所在的按键的数字

#include <iostream>
#include <stdio.h>
#include <map>
using namespace std;

int main() {
    //记录每个字母输入需要花费多长的时间
    map<char, int> inputTime = {
        {'a', 1}, {'b', 2}, {'c', 3},
        {'d', 1}, {'e', 2}, {'f', 3},
        {'g', 1}, {'h', 2}, {'i', 3},
        {'j', 1}, {'k', 2}, {'l', 3},
        {'m', 1}, {'n', 2}, {'o', 3},
        {'p', 1}, {'q', 2}, {'r', 3}, {'s', 4},
        {'t', 1}, {'u', 2}, {'v', 3},
        {'w', 1}, {'x', 2}, {'y', 3}, {'z', 4}
    };
    //记录每个字母属于哪一个按键
    map<char, int> keyMap = {
        {'a', 2}, {'b', 2}, {'c', 2},
        {'d', 3}, {'e', 3}, {'f', 3},
        {'g', 4}, {'h', 4}, {'i', 4},
        {'j', 5}, {'k', 5}, {'l', 5},
        {'m', 6}, {'n', 6}, {'o', 6},
        {'p', 7}, {'q', 7}, {'r', 7}, {'s', 7},
        {'t', 8}, {'u', 8}, {'v', 8},
        {'w', 9}, {'x', 9}, {'y', 9}, {'z', 9}
    };
    char str[100];
    int lastKey = -1; //记录上一个输入的键 ,一开始是没有
    int totalTime, i;
    while (scanf("%s", str) != EOF) {
        totalTime = 0;
        for (i = 0; str[i] != '\0'; ++i) { //字符数组最后一个元素后有一个终止符'\0'
            //判断是否要等待
            if (lastKey == keyMap[str[i]]) { //如果两次输入的字符在同一个键,则有一个等待时间要加上
                totalTime += 2;
            }
            totalTime += inputTime[str[i]];
            lastKey = keyMap[str[i]] ; //注意词典的查找是方括号
        }
        printf("%d\n", totalTime);

    }

}
// 64 位输出请用 printf("%lld")

王道机试指南 文章被收录于专栏

这个专栏是参考王道机试指南中相关的练习题哦

全部评论

相关推荐

02-15 17:05
已编辑
东华理工大学 前端工程师
Beeee0927:我建议是精简一点吧,比如主修的课程,技能特长,自我评价我是觉得可以删掉了。然后项目经历可能要考虑怎么改得更真实一点,因为就我看起来感觉里面太多的东西像是在实际项目中才能接触到的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务