最新华为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 = Nonerepeat_count = 0# 切换模式is_numeric_mode = not is_numeric_modeelif 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 = Nonerepeat_count = 0elif is_numeric_mode:# 数字模式下,直接输出数字output.append(char)else:# 字母模式下if char == prev_char:# 如果按的是同一个按键,增加重复次数,循环选择字母repeat_count += 1else:# 如果按的是不同按键,先输出之前的字符if prev_char is not None:output.append(t9[prev_char][repeat_count % len(t9[prev_char])])# 记录新的按键prev_char = charrepeat_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))

