【华为OD-E卷 - 九宫格按键输入 100分(python、java、c++、js、c)】

devtools/2025/1/8 23:47:40/

pythonjavacjsc_0">【华为OD-E卷 - 九宫格按键输入 100分(pythonjava、c++、js、c)】

题目

九宫格按键输入,有英文和数字两个模式,默认是数字模式,数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母,如果输入 “/” 或者其他字符,则循环中断,输出此时停留的字母。
数字和字母的对应关系如下,注意 0 只对应空格

输入描述

  • 输入范围为数字 0~9 和字符’#’、’/’,输出屏幕显示,例如:

在数字模式下,输入 1234,显示 1234 在英文模式下,输入 1234,显示,adg

输出描述

  • 输出屏幕显示的字符

用例

用例一:
输入:
2222/22
输出:
222222
用例二:
输入:
#2222/22
输出:
ab
用例三:
输入:
#222233
输出:
ae

python_63">python解法

  • 解题思路:
  • 这段代码的目标是模拟手机键盘的输入处理,特别是传统的T9输入法。具体来说,用户输入一串字符,程序根据输入的字符来模拟手机键盘的按键输入,最终输出对应的文本。

T9输入法:T9输入法使用数字键来输入字母。例如,按键 2 映射到字母 “abc”,按键 3 映射到字母 “def”,依此类推。如果连续按多次同一个数字键,则输出字母的不同选择。例如,按键 “2” 第一次按下输出 “a”,第二次输出 “b”,第三次输出 “c”。

输入规则:

输入是一个字符串,字符可以是字母、空格、数字、特殊字符(如 “#”, “/”, 等)。
特殊字符 # 切换输入模式:如果当前输入是英文模式,则切换为数字输入模式,反之亦然。
切换模式时,缓存区的字符会被清空,并根据输入模式来处理后续字符。
/ 则是用于清空当前缓存区的字符,不做任何字符转换。
字符 char 根据当前模式和按键次数,决定最终字符的输出

python">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_143">java解法

  • 解题思路
  • 本题的目标是模拟手机键盘的输入处理,类似于传统的T9输入法。每个数字键对应多个字符,连续按同一个数字键时会依次选择对应的字符。用户输入的字符经过处理后,程序返回最终的文本。

输入模式切换:如果遇到 # 字符,输入模式会在“英文模式”和“数字模式”之间切换。
缓存与重复按键处理:如果当前是英文模式且用户连续按下同一个数字键,程序会根据按键的次数输出对应的字符;如果是数字模式,按键直接转换为数字。
处理流程:
输入字符串:逐字符处理输入的字符串。
输入模式切换:
如果是 #,切换输入模式,并清空缓存。
如果是 /,清空当前缓存。
字符处理:根据当前模式处理字符:
如果是“数字模式”,直接将字符追加到输出中。
如果是“英文模式”,则根据字符的重复按下次数,决定输出字符(比如按 2 一次是 “a”,按两次是 “b”)。
清空操作:flush() 方法在需要时将缓存的字符转换为最终的输出字符。

java">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” 等。
清空操作:通过 / 来清空当前缓存的输入,并结束当前的重复按键计数。

javascript">// 引入 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]; // 根据重复次数选择字符
}

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏


http://www.ppmy.cn/devtools/148368.html

相关文章

【CSS】第二天 画盒子、文字控制属性

【CSS】第二天 1. 画盒子2. 文字控制属性2.1 字体大小2.2 字体粗细2.3 字体样式是否倾斜2.4 行高2.5 行高-垂直居中2.6 字体族2.7 字体复合属性 font 1. 画盒子 目标&#xff1a;使用合适的选择器画盒子。 新属性 <!DOCTYPE html> <html> <head><meta …

卸载wps后word图标没有变成白纸恢复

这几天下载了个wps教育版&#xff0c;后头用完了删了 用习惯的2019图标 给兄弟我干没了&#xff1f;&#xff1f;&#xff1f; 其他老哥说什么卸载关联重新下 &#xff0c;而且还要什么撤销保存原来的备份什么&#xff0c;兄弟也是不得不怂了 后头就发现了这个半宝藏博主&…

网站常用功能模块-鉴权

一&#xff1a;JWT是什么&#xff1f; 常用鉴权方式有很多种&#xff0c;今天主要介绍基于token的鉴权方式JWT&#xff08;Json JSON Web Token&#xff09;。因为这种方式实现起来方便快捷。整体实现逻辑如下 第一次登陆时&#xff0c;前端携带账号和密码请求登录接口。服务…

C++:范围for

范围for&#xff08;range-based for&#xff09;是C的一种循环结构&#xff0c; 是在 C11 这个标准中引入的&#xff0c;这种类型的for循环使得遍历数组、容器中的元素更加简便和直观。 一、范围for语法 for ( 类型 变量名 : 数组名 ) 语句 //多条语句需要加⼤括号 示例&#…

Django Settings 优化与常用配置指南

在Django项目开发中,正确配置和优化settings是至关重要的。本文将详细介绍Django settings的优化策略以及常用的配置项,帮助您更好地管理和组织Django项目的设置。 目录 Django Settings 优化策略常用 Django Settings 配置 © ivwdcwso (ID: u012172506)1. Django Sett…

pdf预览兼容问题- chrome浏览器105及一下预览不了

使用的"tato30/vue-pdf": "^1.11.2"预览插件&#xff0c;发现chrome浏览器105及一下预览不了 pdfPreview预览组件&#xff1a; <template><div id"vue_pdf_view"><div class"tool_tip"><template v-if"pa…

C# 设计模式:装饰器模式与代理模式的区别

C# 设计模式&#xff1a;装饰器模式与代理模式的区别 在软件设计中&#xff0c;装饰器模式&#xff08;Decorator Pattern&#xff09;和代理模式&#xff08;Proxy Pattern&#xff09;都是结构型设计模式&#xff0c;它们的目的都是通过对对象进行包装&#xff0c;来增加或改…

计算机网络——期末复习(7)期末试卷样例3

一、辨析题&#xff08;共4小题&#xff0c;每小题5分&#xff0c;共20分&#xff09; 1.差错检测是保障网络正常通信的一项重要措施&#xff0c;有多种差错检测算法&#xff08;技术&#xff09;&#xff0c; &#xff08;1&#xff09;以太网和IP协议各自采用的差错校验算法…