最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客
题目描述
九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入""或者其他字符,则循环中断,输出此时停留的字母。数字和字母的对应关系如下,注意0只对应空格:
输入一串按键,要求输出屏幕显示1.#用于切换模式,默认是数字模式,执行 #后切换为英文模式;2./表示延迟,例如在英文模式下,输入 22/222,显示为 bc,数字模式下/没有效果,3.英文模式下,多次按同一键,例如输入 22222,显示为b;输入描述
输入范围为数字 o~9 和字符"#’、",输出屏幕显示,例如:在数字模式下,输入 1234,显示1234在英文模式下,输入 1234,显示,adg输出描述
输出屏幕显示的字符
示例1
输入
2222/22
输出
222222
说明
默认数字模式,字符直接显示,数字模式下/无序
示例2
输入
#2222/22
输出
ab
说明
#进入英文模式,连续的数字输入会循环选择字母,!直至输入/,故第一段2222输入显示a,第二段22输入显示b
示例3
输入
#222233
输出
ae
说明
#进入英文模式,连续的数字输入会循环选择字母,直至输入其他数字,故第一段2222输入显示a,第二段33输入显示e
解题思路
- 初始时处于数字模式。此时任何按键都直接输出其对应的数字。
- 当遇到 # 时,切换为字母模式。在字母模式下,按下某个数字键会循环选择该键的字母。如果输入 / 和 # 则终止当前按键的字母选择并输出当前选定的字母。
- 遇到 # 再次切换回数字模式。
- 最后根据输入的按键顺序生成输出结果。
具体步骤
步骤 1:初始化变量
- 使用一个 is_numeric_mode 布尔变量来追踪当前是否处于数字模式。
- prev_char 记录上一个按键,用于判断是否在字母模式下按了相同的键。
- repeat_count 记录在字母模式下,按同一个按键的次数,用于循环选择该键的字母。
步骤 2:处理按键输入
- 遍历输入的每个字符:
- 如果是 #,切换模式(从数字模式切到字母模式,或从字母模式切到数字模式),并且可能会输出字母。
- 如果是 /,在字母模式下终止当前按键的循环,并输出当前按键选择的字母。
- 如果处于数字模式,直接将按键的数字输出。
-如果处于字母模式:
- 若连续按同一个按键,更新 repeat_count,在该键对应的字母中循环选择。
- 若按下的是不同的按键,则输出前一个按键的结果,开始处理新的按键。
步骤 3:处理最后的输入
- 当输入结束时,如果字母模式下最后一个按键还没有输出结果,手动输出这个按键的字母。
c++解法:
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {
string input;
cin >> input;
// T9键盘字母映射
unordered_map<char, string> t9 = {
{'1', ",."}, {'2', "abc"}, {'3', "def"},
{'4', "ghi"}, {'5', "jkl"}, {'6', "mno"},
{'7', "pqrs"}, {'8', "tuv"}, {'9', "wxyz"},
{'0', " "} // 0 对应空格
};
bool isNumericMode = true; // 默认模式是数字模式
string output; // 存储输出的结果
char prevChar = '\0'; // 记录上一个字符,用于判断是否按了相同的按键
int repeatCount = 0; // 用于记录重复按键的次数
// 遍历输入的每一个字符
for (char c : input) {
if (c == '#') {
// 如果是 '#', 切换模式之前,先输出当前字符(如果在英文模式下)
if (!isNumericMode && prevChar != '\0') {
output += t9[prevChar][repeatCount % t9[prevChar].size()];
prevChar = '\0'; // 重置上一个字符
repeatCount = 0; // 重置重复按键计数
}
// 切换数字模式和字母模式
isNumericMode = !isNumericMode;
} else if (c == '/') {
// 如果是 '/',它在字母模式下终止当前按键的循环
if (!isNumericMode && prevChar != '\0') {
output += t9[prevChar][repeatCount % t9[prevChar].size()];
prevChar = '\0'; // 重置上一个字符
repeatCount = 0; // 重置重复按键计数
}
} else if (isNumericMode) {
// 数字模式,直接输出输入的字符
output += c;
} else {
// 字母模式
if (c == prevChar) {
// 如果按了相同的按键,增加重复次数,选择相应的字母
repeatCount++;
} else {
// 如果按了不同的按键,先输出之前的字符
if (prevChar != '\0') {
output += t9[prevChar][repeatCount % t9[prevChar].size()];
}
// 更新为新的按键字符
prevChar = c;
repeatCount = 0; // 重置重复按键计数
}
}
}
// 如果最后一段输入仍处于字母模式,且有未输出的字符,则输出最后一个字符
if (!isNumericMode && prevChar != '\0') {
output += t9[prevChar][repeatCount % t9[prevChar].size()];
}
// 输出最终结果
cout << output << endl;
return 0;
}
Java解法:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine(); // 输入按键序列
// T9键盘映射
Map<Character, String> t9 = new HashMap<>();
t9.put('1', ",.");
t9.put('2', "abc");
t9.put('3', "def");
t9.put('4', "ghi");
t9.put('5', "jkl");
t9.put('6', "mno");
t9.put('7', "pqrs");
t9.put('8', "tuv");
t9.put('9', "wxyz");
t9.put('0', " "); // 0 对应空格
boolean isNumericMode = true; // 默认模式是数字模式
StringBuilder output = new StringBuilder(); // 用于存储输出结果
char prevChar = '\0'; // 用于记录上一个按键字符
int repeatCount = 0; // 用于记录按键重复次数
// 遍历输入的字符
for (char c : input.toCharArray()) {
if (c == '#') {
// 切换模式前,如果在字母模式且有未输出的字符,先输出该字符
if (!isNumericMode && prevChar != '\0') {
output.append(t9.get(prevChar).charAt(repeatCount % t9.get(prevChar).length()));
prevChar = '\0'; // 重置上一个按键
repeatCount = 0; // 重置按键次数
}
// 切换数字模式和字母模式
isNumericMode = !isNumericMode;
} else if (c == '/') {
// 字母模式下,遇到 '/' 输出当前按键所对应的字符
if (!isNumericMode && prevChar != '\0') {
output.append(t9.get(prevChar).charAt(repeatCount % t9.get(prevChar).length()));
prevChar = '\0'; // 重置上一个按键
repeatCount = 0; // 重置按键次数
}
} else if (isNumericMode) {
// 数字模式下,直接输出按键对应的字符
output.append(c);
} else {
// 字母模式下
if (c == prevChar) {
// 如果是同一个按键,增加重复次数,循环字母
repeatCount++;
} else {
// 如果是不同的按键,输出前一个按键的结果
if (prevChar != '\0') {
output.append(t9.get(prevChar).charAt(repeatCount % t9.get(prevChar).length()));
}
// 开始记录新的按键
prevChar = c;
repeatCount = 0; // 重置按键次数
}
}
}
// 如果最后的按键还有未输出的字符,输出它
if (!isNumericMode && prevChar != '\0') {
output.append(t9.get(prevChar).charAt(repeatCount % t9.get(prevChar).length()));
}
// 输出结果
System.out.println(output.toString());
sc.close();
}
}
python解法:
# T9 键盘映射
t9 = {
'1': ",.", '2': "abc", '3': "def",
'4': "ghi", '5': "jkl", '6': "mno",
'7': "pqrs", '8': "tuv", '9': "wxyz",
'0': " " # 0 对应空格
}
# 读取输入
input_sequence = input()
is_numeric_mode = True # 初始模式为数字模式
output = [] # 用于存储输出的结果
prev_char = None # 记录上一次按下的字符
repeat_count = 0 # 记录同一按键的重复次数
# 遍历输入的字符
for char in input_sequence:
if char == '#':
# 在切换模式之前,如果在字母模式下且有未输出的字符,则先输出该字符
if not is_numeric_mode and prev_char is not None:
output.append(t9[prev_char][repeat_count % len(t9[prev_char])])
prev_char = None
repeat_count = 0
# 切换模式
is_numeric_mode = not is_numeric_mode
elif char == '/':
# 在字母模式下,遇到 '/' 输出当前按键对应的字符
if not is_numeric_mode and prev_char is not None:
output.append(t9[prev_char][repeat_count % len(t9[prev_char])])
prev_char = None
repeat_count = 0
elif is_numeric_mode:
# 数字模式下,直接输出数字
output.append(char)
else:
# 字母模式下
if char == prev_char:
# 如果按的是同一个按键,增加重复次数,循环选择字母
repeat_count += 1
else:
# 如果按的是不同按键,先输出之前的字符
if prev_char is not None:
output.append(t9[prev_char][repeat_count % len(t9[prev_char])])
# 记录新的按键
prev_char = char
repeat_count = 0
# 如果最后一个按键还有未输出的字符,输出它
if not is_numeric_mode and prev_char is not None:
output.append(t9[prev_char][repeat_count % len(t9[prev_char])])
# 输出结果
print(''.join(output))