题解 | 手机键盘
手机键盘
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;
}