欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 华为OD机试真题-九宫格按键输入-2024年OD统一考试(E卷)

华为OD机试真题-九宫格按键输入-2024年OD统一考试(E卷)

2025/11/12 9:37:25 来源:https://blog.csdn.net/2301_76848549/article/details/142255265  浏览:    关键词:华为OD机试真题-九宫格按键输入-2024年OD统一考试(E卷)

最新华为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))

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词