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

news2024/12/23 20:56:45

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在typescript浏览器端中调用C++编写的函数,WebAssembly传递指针类型的参数,以及处理指针类型的返回值。

首先要在Cmake工程中的cmakelists.txt文件中引入Emscripten工具链&#xff1a; set(CMAKE_TOOLCHAIN_FILE "D:/CppPkg/emsdk/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake")直接看C代码&#xff1a; #include <emscripten/emscripten.h> #i…

服务器——装新的CUDA版本的方法

服务器——装新的CUDA版本 一、进入 CUDA 版本列表二、根据自己服务器&#xff0c;选择对应的版本和配置三、使用管理员用户&#xff0c;运行下载和安装命令四、查看显卡驱动是否安装4.1 若安装了显卡驱动4.2 若显卡驱动没安装 参考文章 一、进入 CUDA 版本列表 CUDA Toolkit …

MFC工控项目实例之十七添加手动测试界面

承接专栏《MFC工控项目实例之十六输入信号验证》 1、在JogTest.h文件中添加代码 class CJogTest : public CDialog { public:CJogTest(CWnd* pParent NULL); // standard constructorCButtonST m_btnStart[16];CFont m_font; ... } 2、在JogTest.cpp文件中添加代码 #…

【医药行业】实施SAP有哪些医药行业GXP的合规要求和注意事项

作为实施过辉瑞和赛诺菲医药行业的项目&#xff0c;总结了如下&#xff1a; 在医药行业中&#xff0c;GxP&#xff08;Good Practices&#xff0c;良好规范&#xff09;是一系列标准与指南&#xff0c;旨在确保制药、医疗设备和生物制品的质量与合规性。GxP包括多个领域&#x…

计算机网络通关学习(一)

简介 之前我通过王道的考研课进行了计算机网络的学习&#xff0c;但是在秋招准备过程中发现之前的笔记很多不足&#xff0c;学习的知识不够深入和巩固&#xff0c;所以再重新对《图解HTTP》&《图解TCP/IP》进行深度学习后&#xff0c;总结出了此篇博客&#xff0c;由于内容…

re题(27)BUUFCTF-[MRCTF2020]Transform

BUUCTF在线评测 (buuoj.cn) 先到ida&#xff0c;先看一下字符串 找到主函数 int __cdecl main(int argc, const char **argv, const char **envp) {char Str[104]; // [rsp20h] [rbp-70h] BYREFint j; // [rsp88h] [rbp-8h]int i; // [rsp8Ch] [rbp-4h]sub_402230(argc, arg…

ai扩图用什么软件?探索五大高效工具

Hey朋友们&#xff0c;最近在社交媒体上看到不少超清晰的美图&#xff0c;是不是特别羡慕&#xff1f; 别急&#xff0c;告诉你个秘密武器——ai扩图软件。这些神器能帮你智能扩展图片内容&#xff0c;让每张图都充满细节。 想知道都有哪些好用的ai扩图软件免费吗&#xff1f…

CentOS上使用rpm离线安装Mosquitto(Linux上Mqtt协议调试工具)附资源下载

场景 Windows上Mqtt服务器搭建与使用客户端工具MqttBox进行测试&#xff1a; Windows上Mqtt服务器搭建与使用客户端工具MqttBox进行测试_微软消息队列 测试工具-CSDN博客 Windows服务器上Mqtt服务器EMQX的安装使用&#xff1a; Windows服务器上Mqtt服务器EMQX的安装使用_wi…

Objects as Points基于中心点的目标检测方法CenterNet—CVPR2019

Anchor Free目标检测算法—CenterNet Objects as Points论文解析 Anchor Free和Anchor Base方法的区别在于是否在检测的过程中生成大量的先验框。CenterNet直接预测物体的中心点的位置坐标。 CenterNet本质上类似于一种关键点的识别。识别的是物体的中心点位置。 有了中心点之…

Python青少年简明教程:tkinter库入门

Python青少年简明教程&#xff1a;tkinter库入门 tkinter是Python的标准GUI&#xff08;图形用户界面&#xff09;库。它提供了一种快速而简单的方法来创建GUI应用程序。tkinter是Python自带的&#xff0c;无需额外安装&#xff0c;随 Python 安装包一起提供。 在Python 3.x中…

Leetcode—1137. 第 N 个泰波那契数【简单】

2024每日刷题&#xff08;160&#xff09; Leetcode—1137. 第 N 个泰波那契数 记忆化搜索实现代码 class Solution { public:int tribonacci(int n) {int zero 0;int one 1;int two 1;if(n 0) {return zero;}if(n 1) {return one;}if(n 2) {return two;}int ans 0;fo…

三重因素,巨人瘦身——从 IBM中国研发部裁员讲起

如何看待IBM中国研发部裁员&#xff1f;近日&#xff0c;IBM中国宣布撤出在华两大研发中心&#xff0c;引发了IT行业对于跨国公司在华研发战略的广泛讨论。这一决定不仅影响了众多IT从业者的职业发展&#xff0c;也让人思考全球化背景下中国IT产业的竞争力和未来发展方向。面对…

手机、平板电脑编程———未来之窗行业应用跨平台架构

一、平板编程优点 1. 便携性强 - 可以随时随地携带平板进行编程&#xff0c;不受地点限制&#xff0c;方便在旅行、出差或休息时间进行学习和开发。 2. 直观的触摸操作 - 利用触摸屏幕进行代码编辑、缩放、拖动等操作&#xff0c;提供了一种直观和自然的交互方式。 …

TypeScript:高级类型

一、交叉类型&#xff08;Intersection Types&#xff09; 交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型&#xff0c;它包含了所需的所有类型的特性。 例如&#xff0c; Person & Serializable & Loggable同时是 Person …

建模杂谈系列256 规则函数化改造

说明 之前尝试用FastAPI来构造规则&#xff0c;碰到的问题是由于请求量过大(TPS > 1000), 从而导致微服务端口资源耗尽。所以现在的point是: 1 如何使用函数来替代微服务(同时要保留使用微服务的优点)2 进一步抽象并规范规则的执行3 等效合并规则的方法 内容 0 机制讨论…

Vue2源码解读

vue源码_哔哩哔哩_bilibili 1.Vue源码路径目录解读 Vue2源码的路径目录被设计得非常清晰&#xff0c;每个文件夹都承担着特定的职责和功能。以下是这些主要文件夹&#xff08;compiler、core、platform、server、sfc、shared&#xff09;的详细解读&#xff1a; 1. compiler …

LLM大模型部署实战指南:Ollama简化流程,OpenLLM灵活部署,LocalAI本地优化,Dify赋能应用开发

1. Ollama 部署的本地模型(&#x1f53a;) Ollama 是一个开源框架&#xff0c;专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计。&#xff0c;这是 Ollama 的官网地址&#xff1a;https://ollama.com/ 以下是其主要特点和功能概述&#xff1a; …

VLMEvalKit 评测实践:InternVL2 VS Qwen2VL

一、InternVL2简介 InternVL2是由上海人工智能实验室OpenGVLab发布的一款多模态大模型&#xff0c;其中文名称为“书生万象”。该模型在多学科问答&#xff08;MMMU&#xff09;任务上表现出色&#xff0c;成为国内首个在该任务上性能突破60的模型&#xff0c;被誉为开源多模态…

k8s 微服务 ingress-nginx 金丝雀发布

目录 一 什么是微服务 二 微服务的类型 三 ipvs模式 3.1 ipvs模式配置方式 四 微服务类型详解 4.1 clusterip 4.2 ClusterIP中的特殊模式headless 4.3 nodeport 4.4 loadbalancer 4.5 metalLB 4.6 externalname 五 Ingress-nginx 5.1 ingress-nginx功能 5.2 部署…

5. Python之数据类型

Python数据类型有数值型&#xff0c;字符串型&#xff0c;布尔型等等 内置函数type()&#xff0c;可以查看变量的数据类型 。 一、数值类型 整数&#xff08;没有小数部分&#xff0c;包含正整数&#xff0c;负整数&#xff0c;0&#xff0c;默认为十进制数&#xff09;&…