华为OD机试 - 九宫格按键输入 - 逻辑分析(Java 2023 B卷 200分)

题目描述

九宫格按键输入,输出显示内容。有英文和数字两个模式,默认是数字模式。数字模式直接输出数字,英文模式连续按同一个按键会依次出现这个按键上的字母。如果输入“/”或其他字符,则循环中断。

输入描述

输入范围为数字0~9和字符#、/。输出屏幕显示。例如在数字模式下,输入1234,显示1234;在英文模式下,输入1234,显示,adg。

输出描述

  • #用于切换模式,默认是数字模式,执行#后切换为英文模式。
  • /表示延迟,例如在英文模式下,输入22/222,显示为bc。
  • 英文模式下,多次按同一键,例如输入22222,显示为b。

解题思路

这个问题可以通过状态机来解决。我们需要维护当前模式(数字模式或英文模式)以及当前按键的连续按击次数。根据输入字符的不同,我们更新状态并生成相应的输出。

代码实现

Java
import java.util.*;public class NineKeyInput {private static final String[] DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};private static final String[] LETTERS = {" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};public String processInput(String input) {boolean isNumberMode = true;StringBuilder output = new StringBuilder();int index = 0;while (index < input.length()) {char ch = input.charAt(index);if (ch == '#') {isNumberMode = !isNumberMode;index++;} else if (ch == '/') {index++;} else if (Character.isDigit(ch)) {int digit = ch - '0';if (isNumberMode) {output.append(DIGITS[digit]);index++;} else {int count = 0;while (index < input.length() && input.charAt(index) == ch) {count++;index++;}String letters = LETTERS[digit];output.append(letters.charAt((count - 1) % letters.length()));}} else {index++;}}return output.toString();}public static void main(String[] args) {NineKeyInput processor = new NineKeyInput();System.out.println(processor.processInput("123#222235/56")); // 123adjjm}
}
Python
class NineKeyInput:DIGITS = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]LETTERS = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"]def process_input(self, input_str):is_number_mode = Trueoutput = []index = 0while index < len(input_str):ch = input_str[index]if ch == '#':is_number_mode = not is_number_modeindex += 1elif ch == '/':index += 1elif ch.isdigit():digit = int(ch)if is_number_mode:output.append(self.DIGITS[digit])index += 1else:count = 0while index < len(input_str) and input_str[index] == ch:count += 1index += 1letters = self.LETTERS[digit]output.append(letters[(count - 1) % len(letters)])else:index += 1return ''.join(output)processor = NineKeyInput()
print(processor.process_input("123#222235/56"))  # 123adjjm
C++
#include <iostream>
#include <string>
#include <vector>using namespace std;class NineKeyInput {
private:vector<string> DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};vector<string> LETTERS = {" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};public:string processInput(string input) {bool isNumberMode = true;string output;int index = 0;while (index < input.length()) {char ch = input[index];if (ch == '#') {isNumberMode = !isNumberMode;index++;} else if (ch == '/') {index++;} else if (isdigit(ch)) {int digit = ch - '0';if (isNumberMode) {output += DIGITS[digit];index++;} else {int count = 0;while (index < input.length() && input[index] == ch) {count++;index++;}string letters = LETTERS[digit];output += letters[(count - 1) % letters.length()];}} else {index++;}}return output;}
};int main() {NineKeyInput processor;cout << processor.processInput("123#222235/56") << endl; // 123adjjmreturn 0;
}
JavaScript
class NineKeyInput {constructor() {this.DIGITS = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];this.LETTERS = [" ", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"];}processInput(input) {let isNumberMode = true;let output = '';let index = 0;while (index < input.length) {const ch = input[index];if (ch === '#') {isNumberMode = !isNumberMode;index++;} else if (ch === '/') {index++;} else if (/\d/.test(ch)) {const digit = parseInt(ch);if (isNumberMode) {output += this.DIGITS[digit];index++;} else {let count = 0;while (index < input.length && input[index] === ch) {count++;index++;}const letters = this.LETTERS[digit];output += letters[(count - 1) % letters.length];}} else {index++;}}return output;}
}const processor = new NineKeyInput();
console.log(processor.processInput("123#222235/56")); // 123adjjm

复杂度分析

  • 时间复杂度: O(n),其中n是输入字符串的长度。我们需要遍历整个字符串一次来处理每个字符。
  • 空间复杂度: O(1),除了输出字符串外,我们只使用了常数空间来存储模式和当前按键的连续按击次数。

总结

我们使用了状态机来处理这个问题,通过维护当前模式和按键的连续按击次数,能够有效地生成相应的输出。这种方法简单直观,适用于处理这种模式切换和按键映射的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3系列:vite+vue3怎么配置通过ip和端口打开浏览器

目录 1.前言 2.修改前的 3.修改后的 4.效果 5.其他 1.前言 想要使用IP端口号的方式访问页面&#xff0c;结果无法访问 查了些资料&#xff0c;原来是vite.config.js需要加一些配置才能让他通过IP访问&#xff0c;默认的只能localhost:端口号访问 2.修改前的 使用vue3默认…

使用yolov8+flask实现精美登录界面+图片视频摄像头检测系统

这个是使用flask实现好看登录界面和友好的检测界面实现yolov8推理和展示&#xff0c;代码仅仅有2个html文件和一个python文件&#xff0c;真正做到了用最简洁的代码实现复杂功能。 测试通过环境&#xff1a; windows x64 anaconda3python3.8 ultralytics8.3.81 flask1.1.2…

突破连接边界!O9201PM Wi-Fi 6 + 蓝牙 5.4 模块重新定义笔记本无线体验

在当今数字化时代&#xff0c;笔记本电脑已成为人们工作、学习和娱乐的必备工具。而无线连接技术&#xff0c;作为笔记本电脑与外界交互的关键桥梁&#xff0c;其性能的优劣直接关乎用户体验的好坏。当下&#xff0c;笔记本电脑无线连接领域存在诸多痛点&#xff0c;严重影响着…

2025 香港 Web3 嘉年华:全球 Web3 生态的年度盛会

自 2023 年首届香港 Web3 嘉年华成功举办以来&#xff0c;这一盛会已成为全球 Web3 领域规模最大、影响力最深远的行业活动之一。2025 年 4 月 6 日至 9 日&#xff0c;第三届香港 Web3 嘉年华将在香港盛大举行。本届活动由万向区块链实验室与 HashKey Group 联合主办、W3ME 承…

Windows11 新机开荒(二)电脑优化设置

目录 前言&#xff1a; 一、注册微软账号绑定权益 二、此电脑 桌面图标 三、系统分盘及默认存储位置更改 3.1 系统分盘 3.2 默认存储位置更改 四、精简任务栏 总结&#xff1a; 前言&#xff1a; 本文承接上一篇 新机开荒&#xff08;一&#xff09; 上一篇文章地址&…

[C++面试] 标准容器面试点

一、入门 1、vector和list的区别 [C面试] vector 面试点总结 vector 是动态数组&#xff0c;它将元素存储在连续的内存空间中。支持随机访问&#xff0c;即可以通过下标快速访问任意位置的元素&#xff0c;时间复杂度为 O(1)&#xff0c;准确点是均摊O(1)。但在中间或开头插…

蓝桥杯每日一题

丢失的雨伞 题目思路代码演示 题目 今天晚上本来想练习一下前缀和与差分 结果给我搜出来这题&#xff08;几乎没啥关系&#xff09;&#xff0c;我看半天有点思路但又下不了手哈哈&#xff0c;难受一批 在图书馆直接红温了 题目链接 思路 题目要求找到两个不重叠的区间&…

校园安全用电怎么保障?防触电装置来帮您

引言 随着教育设施的不断升级和校园用电需求的日益增长&#xff0c;校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备&#xff0c;其在校园中的应用不仅能够提高电力系统的安全性&#xff0c;还能有效保障师生的用电安全&am…

Matlab 汽车二自由度转弯模型

1、内容简介 Matlab 187-汽车二自由度转弯模型 可以交流、咨询、答疑 2、内容说明 略 摘 要 本文前一部分提出了侧偏角和横摆角速度作为参数。描述了车辆运动的运动状态&#xff0c;其中文中使用的参考模型是二自由度汽车模型。汽车速度被认为是建立基于H.B.Pacejka的轮胎模…

OpenCV计算摄影学(20)非真实感渲染之增强图像的细节函数detailEnhance()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此滤波器增强特定图像的细节。 cv::detailEnhance用于增强图像的细节&#xff0c;通过结合空间域和频率域的处理&#xff0c;提升图像中特定细节…

Java面试八股—Redis篇

一、Redis的使用场景 &#xff08;一&#xff09;缓存 1.Redis使用场景缓存 场景&#xff1a;缓存热点数据&#xff08;如用户信息、商品详情&#xff09;&#xff0c;减少数据库访问压力&#xff0c;提升响应速度。 2.缓存穿透 正常的访问是&#xff1a;根据ID查询文章&…

2025-03-17 Unity 网络基础1——网络基本概念

文章目录 1 网络1.1 局域网1.2 以太网1.3 城域网1.4 广域网1.5 互联网&#xff08;因特网&#xff09;1.6 万维网1.7 小结 2 IP 地址2.1 IP 地址2.2 端口号2.3 Mac 地址2.4 小结 3 客户端与服务端3.1 客户端3.2 服务端3.3 网络游戏中的客户端与服务端 1 网络 ​ 在没有网络之前…

【工业现场总线】控制网络的主要特点是?OSI参考模型的分层是?

目录 1、控制网络的主要特点&#xff1f; 2、网络拓扑结构的主要类型&#xff1f;其各自主要特点是什么&#xff1f; 3、网络的传输介质主要有什么&#xff1f; 4、网络传输介质的访问控制方式主要有哪些&#xff1f;其各自主要特点是什么&#xff1f; 5、OSI参考模型的分…

微软开源神器OmniParser V2.0 介绍

微软开源的OmniParser V2.0是一款基于纯视觉技术的GUI智能体解析工具&#xff0c;旨在将用户界面&#xff08;UI&#xff09;截图转换为结构化数据&#xff0c;从而实现对计算机屏幕上的可交互元素的高效识别和操控。这一工具通过结合先进的视觉解析技术和大型语言模型&#xf…

用python代码将excel中的数据批量写入Json中的某个字段,生成新的Json文件

需求 需求&#xff1a; 1.将execl文件中的A列赋值给json中的TrackId&#xff0c;B列赋值给json中的OId 要求 execl的每一行&#xff0c;对应json中的每一个OId json 如下&#xff1a; {"List": [{"BatchNumber": "181-{{var}}",// "Bat…

实验篇| Nginx环境搭建-安全配置

在前面的文章里&#xff0c;阿祥详细介绍了在 Windows 系统中安装 Nginx 服务器的具体操作步骤&#xff0c;感兴趣的朋友可以参考&#xff1a;实验篇 | Nginx 反向代理 - 7 层代理 。完成 Nginx 的安装只是搭建 Web 服务的第一步&#xff0c;为了保障服务器的稳定运行以及数据安…

理解我们单片机拥有的资源

目录 为什么要查询单片机拥有的资源 所以&#xff0c;去哪些地方可以找数据手册 一个例子&#xff1a;STM32F103C8T6 前言 本文章隶属于项目&#xff1a; Charliechen114514/BetterATK: This is a repo that helps rewrite STM32 Common Repositorieshttps://github.com/C…

从零开始 | C语言基础刷题DAY3

❤个人主页&#xff1a;折枝寄北的博客 目录 1.打印3的倍数的数2.从大到小输出3. 打印素数4.打印闰年5.最大公约数 1.打印3的倍数的数 题目&#xff1a; 写一个代码打印1-100之间所有3的倍数的数字 代码&#xff1a; int main(){int i 0;for (i 1; i < 100; i){if (i % …

Blender材质 - 层权重

层权重 混合着色器 可以让 面朝向的一面显示一种材质 另一面显示另一种材质 就能实现挺不错的材质效果 移动视角 材质会跟着变化 有点类似虚幻的视差节点BumpOffset

3个 Vue $set 的应用场景

大家好&#xff0c;我是大澈&#xff01;一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;&#xff0c;关注我&#xff0c;科技未来或许我能帮到你&#xff01; 在 Vue2 中&#xff0c;由于 Object.defineProperty 的限制&#…