华为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 = 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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ai因思坦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值