题解 | 手机键盘

手机键盘

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

#include <bits/stdc++.h>
using namespace std;

// 先定义正确的键盘映射表(字母→(按键编号, 按键次数))
unordered_map<char, pair<int, int>> key_map = {
    {'a', {2, 1}}, {'b', {2, 2}}, {'c', {2, 3}},
    {'d', {3, 1}}, {'e', {3, 2}}, {'f', {3, 3}},
    {'g', {4, 1}}, {'h', {4, 2}}, {'i', {4, 3}},
    {'j', {5, 1}}, {'k', {5, 2}}, {'l', {5, 3}},
    {'m', {6, 1}}, {'n', {6, 2}}, {'o', {6, 3}},
    {'p', {7, 1}}, {'q', {7, 2}}, {'r', {7, 3}}, {'s', {7, 4}},
    {'t', {8, 1}}, {'u', {8, 2}}, {'v', {8, 3}},
    {'w', {9, 1}}, {'x', {9, 2}}, {'y', {9, 3}}, {'z', {9, 4}}
};

// 判断是否同键,并返回两个字符的按键次数
tuple<bool, int, int> is_same_key(char ch1, char ch2) {
    int key1 = key_map[ch1].first;  // 字符1的按键编号
    int cnt1 = key_map[ch1].second; // 字符1的按键次数
    int key2 = key_map[ch2].first;
    int cnt2 = key_map[ch2].second;
    return make_tuple(key1 == key2, cnt1, cnt2);
}

int main() {
    string s;
    // sum要定义在循环内,每组输入重新初始化
    while (cin >> s) {
        int sum = 0; // 每组输入重置累加和
        int n = s.size();
        if (n == 1) {
            // 单字符:直接取按键次数
            sum = key_map[s[0]].second;
            cout << sum << endl;
        } else {
            // 多字符:遍历计算
            for (int i = 0; i < n - 1; i++) {
                auto [flag, r1, r2] = is_same_key(s[i], s[i+1]);
                if (i == 0) {
                    // 第一个字符+第二个字符:累加两个的按键次数,同键加2等待
                    sum += r1 + r2;
                    if (flag) sum += 2;
                } else {
                    // 后续字符:只累加当前字符的按键次数,同键加2等待
                    sum += r2;
                    if (flag) sum += 2;
                }
            }
            cout << sum << endl;
        }
    }
    return 0;
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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