题解 | 手机键盘

手机键盘

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

很怀旧的一道题——如果没有使用过按键手机,是很难在上机现场做出这道题的。

在九键手机中,2~9号键对应字母,其中除了7、9号键对应四个字母外,其余6个数字键对应三个字母。因此,不妨将每个字母对应需要按动的次数存入数组;判断字符串中相邻两个字母是否位于同一个数字按键也就转化为这两个字母在字母表上的编号之差是否与他们在键盘上按动次数之差相等——若相等则在同一按键,对应需要额外等待2个时间周期;反之则按键不同。

#include <bits/stdc++.h>
#define _CRT_SECURE_NO_DEPRECATE

int main() {
    std::string target;
    while (std::cin >> target) {
        /*
        ┌=====|=====|=====┐
        |  1  |  2  |  3  |
        |     | ABC | DEF |
        |-----|-----|-----|
        |  4  |  5  |  6  |
        | GHI | JKL | MNO |
        |-----|-----|-----|
        |  7  |  8  |  9  |
        |PQ RS| TUV |WX YZ|
        |-----|-----|-----|
        |  *  |  0  |  #  |
        |     |Space|     |
        └=================┘
        */
        std::vector<int> letterKeyTouchCountRefList = {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 sameKeyInterval = 2, totalTime = 0;
        for (int i = 0; i < target.size(); i++) {
            if (i != 0 &&
                    target[i] - target[i - 1] == letterKeyTouchCountRefList[target[i] - 'a'] -
                    letterKeyTouchCountRefList[target[i - 1] - 'a']) {
                // 字母与上一个字母位于同一键上,需要在上一个字母输入后额外等待
                totalTime += sameKeyInterval;
            }
            // 按了就是按了;总时间加上输入这个字母必然需要按动的时间段数
            totalTime += letterKeyTouchCountRefList[target[i] - 'a'];
        }
        std::cout << totalTime << std::endl;
    }
    return 0;
}
牛客题库练习笔记 文章被收录于专栏

有的时候心血来潮会来做题。做题就会有笔记。

全部评论

相关推荐

鼠鼠第一次实习,啥也不懂一直是自己一个人吃的饭,不会做工作老是被嫌弃,大人的世界是这样的吗?
我是星星我会发亮:好的mt有两种,一种愿意教你的,一种几乎什么活都不给你派让你很闲允许你做自己事情的
点赞 评论 收藏
分享
05-23 20:31
已编辑
武汉大学 Java
内向的柠檬精在研究求职打法:注意把武大标粗标大 本地你俩不是乱杀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务