当前位置: 首页 > news >正文

手风琴网站模板百度接单平台

手风琴网站模板,百度接单平台,学做美食交流网站,医疗网站建设基本流程图【华为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]; // 根据重复次数选择字符
}

注意:

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

http://www.mnyf.cn/news/41096.html

相关文章:

  • 专业的做网站公司平台营销
  • 网站权限查询深圳开发公司网站建设
  • 暴雪代理最新消息优化网站排名软件
  • 衡水网站建设供应商微信营销平台哪个好
  • 云安区市场网络营销方法零基础seo入门教学
  • 六安电商网站建设价格关键词优化哪家好
  • 深圳网站建设制作网络公司广西seo快速排名
  • 休闲旅游网站建设电脑系统优化软件
  • 平台企业临沂seo
  • 太原市做网站公司晋城今日头条新闻
  • 三亚 网站建设陕西企业网站建设
  • 网站制作 手机版系统清理优化工具
  • 温州外贸网站sem竞价开户
  • 网页设计与制作教程 pdf下载苏州seo关键词优化方法
  • 微机做网站的软件如何开发软件app
  • 知名的网站建设公司品牌整合营销方案
  • 做网站什么软件好如何做好品牌宣传
  • wordpress上传安装包网站seo置顶 乐云践新专家
  • 手机搭建免费网站app开发多少钱
  • 云南哪里可以制作自己的网页阳江seo
  • 做泰迪狗网站的意义seo搜索引擎优化推广专员
  • 自己做的网站怎么链接火车头采集百度指数使用指南
  • 网站开发php知乎推广合作
  • 做外贸是在什么网站现在网络推广方式
  • 做网站前需要准备什么农产品网络营销推广方案
  • 集团微信网站方案策划适合小学生的新闻事件
  • 纯js做网站营销方案策划
  • 网站需求表格站长工具网站排名
  • 大型百度云网站建设合肥网站seo费用
  • wordpress视频站模板下载武汉网站seo