【华为OD-E卷 - 九宫格按键输入 100分(python、java、c++、js、c)】
【华为OD-E卷 - 九宫格按键输入 100分(python、java、c++、js、c)】
题目
九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入 “/” 或者其他字符,则循环中断,输出此时停留的字母。
数字和字母的对应关系如下,注意 0 只对应空格
输入描述
- 输入范围为数字 0~9 和字符’#’、’/’,输出屏幕显示,例如:
在数字模式下,输入 1234,显示 1234 在英文模式下,输入 1234,显示,adg
输出描述
- 输出屏幕显示的字符
用例
用例一:
输入:
2222/22
输出:
222222
用例二:
输入:
#2222/22
输出:
ab
用例三:
输入:
#222233
输出:
ae
python解法
- 解题思路:
- 这段代码的目标是模拟手机键盘的输入处理,特别是传统的T9输入法。具体来说,用户输入一串字符,程序根据输入的字符来模拟手机键盘的按键输入,最终输出对应的文本。
T9输入法:T9输入法使用数字键来输入字母。例如,按键 2 映射到字母 “abc”,按键 3 映射到字母 “def”,依此类推。如果连续按多次同一个数字键,则输出字母的不同选择。例如,按键 “2” 第一次按下输出 “a”,第二次输出 “b”,第三次输出 “c”。
输入规则:
输入是一个字符串,字符可以是字母、空格、数字、特殊字符(如 “#”, “/”, 等)。
特殊字符 # 切换输入模式:如果当前输入是英文模式,则切换为数字输入模式,反之亦然。
切换模式时,缓存区的字符会被清空,并根据输入模式来处理后续字符。
/ 则是用于清空当前缓存区的字符,不做任何字符转换。
字符 char 根据当前模式和按键次数,决定最终字符的输出
class PhoneInput:# 模拟手机键盘上每个按键对应的字母KEYS = (" ", ",.", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz")def __init__(self):# 初始化缓冲区、语言模式、重复计数器self.buf = [] # 用来缓存输入的字符self.is_eng = False # 是否处于英文模式self.rep = 0 # 记录同一按键连续按下的次数def process(self, text):"""处理输入的字符。遍历每个字符,处理后返回最终的文本结果。"""for char in text + ' ':# 如果遇到 "#",切换语言模式并清空当前输入if char == '#':self._flush() # 清空当前缓存的字符self.is_eng = not self.is_eng # 切换英文与数字模式# 如果遇到 "/",清空当前缓存区elif char == '/':self._flush() # 清空当前缓存else:self._handle_char(char) # 处理当前字符return ''.join(self.buf) # 返回最终的字符结果,缓存区内容合并成字符串def _handle_char(self, char):"""根据当前模式(英文或数字)处理当前输入的字符。"""# 如果是数字模式,直接将字符加入缓冲区if not self.is_eng:self.buf.append(char)# 如果是英文模式且当前字符与缓存区的最后一个字符不同elif self.rep == 0 or char != self.buf[-1]:self._flush() # 清空缓存,准备新输入self.buf.append(char) # 将当前字符加入缓存self.rep = 1 # 重置重复计数器else:# 如果当前字符与最后一个字符相同,重复计数器加1self.rep += 1def _flush(self):"""刷新缓存区,根据输入模式决定当前按键的输出字符。"""if self.is_eng and self.rep > 0:# 如果是英文模式,并且有重复按键的记录key = int(self.buf.pop()) # 获取按键的数字(最后一个字符)# 根据重复的次数决定字符的选择,使用取余操作循环选择字母char = self.KEYS[key][(self.rep - 1) % len(self.KEYS[key])]self.buf.append(char) # 将最终选择的字母加入缓存区self.rep = 0 # 重置重复计数器def main():processor = PhoneInput() # 创建处理器对象result = processor.process(input()) # 获取输入并处理print(result) # 输出处理后的结果if __name__ == "__main__":main() # 调用main函数,启动程序
java解法
- 解题思路
- 本题的目标是模拟手机键盘的输入处理,类似于传统的T9输入法。每个数字键对应多个字符,连续按同一个数字键时会依次选择对应的字符。用户输入的字符经过处理后,程序返回最终的文本。
输入模式切换:如果遇到 # 字符,输入模式会在“英文模式”和“数字模式”之间切换。
缓存与重复按键处理:如果当前是英文模式且用户连续按下同一个数字键,程序会根据按键的次数输出对应的字符;如果是数字模式,按键直接转换为数字。
处理流程:
输入字符串:逐字符处理输入的字符串。
输入模式切换:
如果是 #,切换输入模式,并清空缓存。
如果是 /,清空当前缓存。
字符处理:根据当前模式处理字符:
如果是“数字模式”,直接将字符追加到输出中。
如果是“英文模式”,则根据字符的重复按下次数,决定输出字符(比如按 2 一次是 “a”,按两次是 “b”)。
清空操作:flush() 方法在需要时将缓存的字符转换为最终的输出字符。
import java.util.Scanner;public class Main {// 手机键盘的每个数字键对应的字母映射private static final String[] KEYS = {" ", ",.", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};private StringBuilder buf; // 用来存储当前的字符序列private boolean isEng; // 是否处于英文模式private int rep; // 记录当前字符的重复按下次数// 构造方法,初始化变量public Main() {this.buf = new StringBuilder(); // 初始化缓存区this.isEng = false; // 默认处于数字模式this.rep = 0; // 重复计数初始化为0}// 处理输入文本的核心方法public String process(String text) {// 将输入的文本加上一个空格处理末尾for (char ch : (text + " ").toCharArray()) {if (ch == '#') {flush(); // 如果遇到#,切换模式并清空缓存isEng = !isEng; // 切换英文模式与数字模式} else if (ch == '/') {flush(); // 如果遇到/,清空缓存} else {handleChar(ch); // 处理其他字符}}return buf.toString(); // 返回处理后的结果}// 处理输入字符的逻辑private void handleChar(char ch) {// 如果是数字模式,直接将字符加入缓存if (!isEng) {buf.append(ch);} else if (rep == 0 || ch != buf.charAt(buf.length() - 1)) {// 如果是英文模式且当前字符与缓存的最后一个字符不同,则清空缓存,重新开始flush();buf.append(ch); // 将当前字符添加到缓存rep = 1; // 重置重复计数为1} else {// 如果当前字符与最后一个字符相同,增加重复计数rep++;}}// 刷新缓存的方法,根据当前输入决定最终字符private void flush() {// 只有在英文模式下且有重复计数时,才进行处理if (isEng && rep > 0) {// 获取当前字符对应的数字键int key = Character.getNumericValue(buf.charAt(buf.length() - 1));// 根据重复次数选取对应的字符char newChar = KEYS[key].charAt((rep - 1) % KEYS[key].length());// 替换缓存中的字符buf.setCharAt(buf.length() - 1, newChar);}rep = 0; // 重置重复计数}// 主函数,程序入口public static void main(String[] args) {Scanner scanner = new Scanner(System.in); // 创建Scanner对象读取输入String input = scanner.nextLine(); // 读取用户输入的字符串scanner.close(); // 关闭ScannerMain processor = new Main(); // 创建Main对象,处理输入String result = processor.process(input); // 处理输入System.out.println(result); // 输出最终结果}
}
C++解法
- 解题思路
更新中
C解法
更新中
JS解法
-
解题思路
-
这段代码的目标是模拟一个手机键盘的输入处理,类似于传统的T9输入法,其中用户输入的数字键对应多个字母,连续按同一数字键可以依次选择不同的字母。当遇到特殊字符时(例如 # 和 /),程序会根据这些输入切换输入模式或清空当前输入。
输入模式切换:通过 # 来切换输入模式,英文模式和数字模式之间进行切换。英文模式下,连续按同一个数字键可以输出不同的字母;数字模式下,直接输出数字字符。
重复按键处理:在英文模式下,如果连续按下同一个数字键,程序会根据按下的次数来输出不同的字符。例如,按下数字 2 第一次输出 “a”,第二次输出 “b”,第三次输出 “c” 等。
清空操作:通过 / 来清空当前缓存的输入,并结束当前的重复按键计数。
// 引入 readline 模块,用于控制台输入输出
const readline = require("readline");// 创建 readline 接口,允许从标准输入读取数据
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 定义状态变量
let isEng = false; // 是否处于英文模式,默认为 false,即数字模式
let repeatCount = 0; // 记录同一键的重复按次数
const stack = []; // 用于存储当前输入的字符序列// 每当读取到一行输入时,触发此事件
rl.on("line", (line) => {console.log(getResult(line)); // 处理输入并打印结果// 全局变量重置isEng = false; // 重置为数字模式repeatCount = 0; // 重置重复计数stack.length = 0; // 清空栈
});// 主处理函数,处理一行输入并返回最终结果
function getResult(s) {s += " "; // 在输入末尾加上空格,用于处理最后一个字符// 遍历输入的每个字符for (let c of s) {switch (c) {case "#":toggleMode(); // 遇到#,切换输入模式break;case "/":interrupt(); // 遇到/,清空当前输入break;default:handleCharacter(c); // 处理普通字符break;}}// 返回处理后的结果,去掉最后一个空格return stack.slice(0, stack.length - 1).join("");
}// 切换输入模式的函数
function toggleMode() {interrupt(); // 切换模式前,先清空缓存isEng = !isEng; // 切换英文模式与数字模式
}// 中断当前输入,清空缓存
function interrupt() {if (!isEng || stack.length === 0 || repeatCount === 0) return; // 如果不是英文模式,或者没有需要处理的字符,直接返回stack.push(mapChar(stack.pop(), repeatCount)); // 根据重复次数,更新当前字符repeatCount = 0; // 重置重复计数
}// 处理普通字符
function handleCharacter(c) {if (!isEng) {// 如果是数字模式,直接将字符添加到栈中stack.push(c);} else {// 如果是英文模式,处理字符if (repeatCount === 0) {stack.push(c); // 如果是第一次按下该键,直接加入栈repeatCount++; // 重复计数加1} else {// 如果当前字符与栈顶字符不同,则刷新当前输入if (c !== stack[stack.length - 1]) {interrupt(); // 清空当前缓存stack.push(c); // 加入新的字符}repeatCount++; // 重复计数加1}}
}// 定义数字键到字符的映射
const dict = [" ", // 0 -> 空格",.", // 1 -> ",.""abc", // 2 -> "abc""def", // 3 -> "def""ghi", // 4 -> "ghi""jkl", // 5 -> "jkl""mno", // 6 -> "mno""pqrs", // 7 -> "pqrs""tuv", // 8 -> "tuv""wxyz", // 9 -> "wxyz"
];// 根据当前字符和重复次数,返回对应的字母
function mapChar(c, repeat) {const num = parseInt(c); // 获取数字键const chars = dict[num]; // 获取该数字键对应的字符映射return chars[(repeat - 1) % chars.length]; // 根据重复次数选择字符
}
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
相关文章:
【华为OD-E卷 - 九宫格按键输入 100分(python、java、c++、js、c)】
【华为OD-E卷 - 九宫格按键输入 100分(python、java、c、js、c)】 题目 九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母…...
基于AI大模型的医院SOP优化:架构、实践与展望
一、引言 1.1 研究背景与意义 近年来,人工智能(AI)技术取得了迅猛发展,尤其是大模型的出现,为各个领域带来了革命性的变化。在医疗领域,AI 医疗大模型正逐渐崭露头角,展现出巨大的应用潜力。随着医疗数据的海量积累以及计算能力的大幅提升,AI 医疗大模型能够对复杂的…...
Linux快速入门-一道简单shell编程题目
编写一个 Shell 程序。 功能:在用户家目录下创建一个文件夹myshell;进入此文件夹;在文件中创建文件aa.sh,如果文件夹或文件存在,则提示对象已存在,不创建。 代码编写 #!/bin/bash#获取用户家目录:方便后…...
Hive如何创建自定义函数(UDF)?
目录 1 自定义UDF函数基础 2 自定义UDF函数案例 3 创建临时函数 4 创建永久函数 1 自定义UDF函数基础 1. 内置函数:Hive 自带了一些函数...
聊聊前端框架中的process.env,env的来源及优先级(next.js、vue-cli、vite)
在平时开发中,常常使用vue、react相关脚手架创建项目,在项目根目录可以创建.env、.env.[mode](mode为development、production、test)、.env.local等文件,然后在项目中就可以通过process.env来访问相关的环境变量了。 下面针对如下…...
linux shell脚本 【分支结构case...in 、循环结构、函数】内附练习
1.思维导图 2.练习 1.定义一个find函数,查找ubuntu和root的gid 2.定义一个数组,写一个函数完成对数组的冒泡排序 bubble() {n${#arr[*]}for((i0;i<n-1;i));dofor((j0;j<n-1-i;j));doif ((arr[j]>arr[j1]));thentemp${arr[j]}arr[j]${arr[j1]}a…...
VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”
VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”VSCode 终端显示“pnpm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本”解决方案: 1.用get-ExecutionP…...
Android ActionBar 技术深度解析
Android ActionBar 技术深度解析 概述 ActionBar 是 Android 应用中的一个核心 UI 组件,用于提供导航、操作和品牌展示。它通常位于应用窗口的顶部,包含应用的标题、导航按钮、操作项等。ActionBar 自 Android 3.0(API 11)引入,并在 Android 5.0(API 21)后被 Toolbar …...
matlab-数字滤波器设计与实战
文章目录 数字滤波器设计FIR 滤波器设计IIR 滤波器设计巴特沃斯滤波器切比雪夫 I 型滤波器切比雪夫II型椭圆滤波器线性相位与非线性相位零相位响应数字滤波器实战数字滤波器产生延迟的主要原因补偿滤波引入的延迟补偿常量滤波器延迟补偿与频率有关的延迟从信号中除去不需要的频…...
JDK的运作原理
JDK(Java Development Kit)是Java开发者用来构建、编译、调试和运行Java应用程序的一套工具包。其核心原理涉及到Java语言的编译、执行以及Java虚拟机(JVM)的运作等多个方面。 1. Java编译原理 Java是一种先编译后解释执行的语言。…...
el-table 实现纵向多级表头
为了实现上图效果,最开始打算用el-row、el-col去实现,但发现把表头和数据分成两大列时,数据太多时会导致所在格高度变高。但由于每一格数据肯定不一样,为保持高度样式一致,就需要我们手动去获取最高格的高度之后再设置…...
Android Studio 下载安装教程(2024 更新版),附详细图文
今天,为大家带来的是Android Studio 2024更新版的下载安装教程,包含详细图文步骤。 随着 Android Studio 的不断更新,自从引入 Koala 系列后,其版本号的命名规则也发生了变化。以本次更新为例,版本号为 2024.2.1&#…...
安全框架:Apache Shiro
安全框架:Apache Shiro 前言您的第一个 Apache Shiro 应用程序Multiple Parts(多个部分)INI配置[main]部分[users]部分[roles]部分[urls]部分默认过滤器常规启用/禁用 密码学会话管理Remember Me 整合SpringBoot登录登录超时记住我注解登录后…...
泊松融合调研
目录 裁剪加速,速度提升2倍多 cuda版: 效果没测,官方效果不错: 效果不好,parosky/poissonblending 裁剪加速,速度提升2倍多 import os import sys import os os.chdir(os.path.dirname(os.path.abspath(__file__))) current_dir = os.path.dirname(os.path.abspath(__…...
uniapp——App下载文件,打开文档(一)
uniapp如何下载文件、打开文件 文章目录 uniapp如何下载文件、打开文件下载文件下载文件成功返回数据格式 打开文档处理 iOS 打开文件可能失败问题 相关API: uni.downloadFileuni.openDocument 注意: 只支持 GET 请求,需要 POST的ÿ…...
Python 列表的高级索引技巧
列表是 Python 中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素。本文将带你深入了解 Python 列表的高级索引技巧,让你在处理数据时更加得心应手。 1.基本索引 首先,我们来看看如何使用基本索引来访…...
UE5.3 虚幻引擎 Windows插件开发打包(带源码插件打包、无源码插件打包)
0 引言 随着项目体量的增大,所有代码功能都放一起很难管理。所以有什么办法可以将大模块划分成一个个小模块吗。当然有,因为虚幻引擎本身就遇到过这个问题,他的解决办法就是使用插件的形式开发。 例如,一个团队开发了文件I/O模块插…...
RC充电电路仿真与分析
RC充电原理 下图是一个常见的RC充电电路:(假设R10K,C100nF) SW断开时,这个电路处于断路状态,C既没有充电也没有放电;SW闭合时,直流电源5V为电容C充电; 充电时电容两端…...
C++ 设计模式:观察者模式(Observer Pattern)
链接:C 设计模式 链接:C 设计模式 - 模板方法 链接:C 设计模式 - 策略模式 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主…...
栈及栈的操作
栈及栈的操作 栈结构 栈是一种只能在一端进行插入或删除操作的数据结构。栈有两个基本的操作:入栈和出栈。 入栈:将一个新的元素放到栈顶。 出栈:从栈顶取出一个元素。栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。栈的操作规则:LIFO(Last…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
