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

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

字符对应关系如图:

在这里插入图片描述

二、输入描述

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

三、输出描述

#用于切换模式,默认是数字模式,执行#后切换为英文模式, /表示延迟,例如在英文模式下,输入22/222,显示为bc;

英文模式下,多次按同一键,例如输入22222,显示为b;

输入输出说明
123#222235/56123adjjm

四、解题思路

  1. 输入一个字符串input;
  2. 定义digitalMode,true表示数字模式,false表示英文模式,默认true;
  3. 定义变量right,表示英文模式下,连续按键模式停止的坐标;
  4. 定义builder,拼接最后的输出内容;
  5. 遍历input;
    • 如果输入" "或者其他字符,则循环中断;
    • 如果是#,切换模式;
    • 如果是/,表示延迟;
    • 如果是数字模式,直接拼接;
    • 如果是英文模式,获取下一个字符,判断与上一个字符是否相等;
      • 如果下一个字符和当前字符相等,则进入连续按键模式;
      • 如果下一个字符和当前字符相等,则表示连续模式结束,开始计算连续按键后输出的字母;
      • 计算连续按键后输出的字母;
      • 如果输入" "或者其他字符,则循环中断;
      • 计算连续按键后输出的字母完毕,开始遍历后面的字符;
  6. 输出最后的拼接字符串builder。

五、Java算法源码

public class OdTest04 {
    /**
     * #用于切换模式,默认是数字模式,执行#后切换为英文模式, /表示延迟
     * 如果输入" "或者其他字符,则循环中断。
     * 123#222235/56  --->  123adjjm
     * 123#2222#3#5//5556  --->  123a3jlm
     * 123#2222#3#50//5556  --->  123a3j
     * 123#22022#3#5//5556  --->  123b
     */

    // 合法字符,如果输入" "或者其他字符,则循环中断
    static String effectiveLetter = "123456789#/";

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        // true表示数字模式,false表示英文模式,默认true
        boolean digitalMode = true;
        // 英文模式下,连续按键模式停止的坐标
        int right = -1;

        // 最后的输出内容
        StringBuilder builder = new StringBuilder();

        for (int i = 0; i < input.length(); i++) {
            // 123#222235/56   i = 4,  3对应8,此时right=7,,,下次遍历从8开始
            if (right >= i) {
                continue;
            }

            char ch = input.charAt(i);

            // 如果输入" "或者其他字符,则循环中断
            if (!effectiveLetter.contains(ch + "")) {
                break;
            }

            switch (ch){
                case '#': // 切换模式
                    digitalMode = !digitalMode;
                    break;
                case '/': // /表示延迟
                    break;
                default:
                    // 数字模式
                    if (digitalMode) {
                        builder.append(ch);
                    }else{ // 英文模式
                        int sameCount = 1;
                        boolean inputError = false;
                        for (int j = i + 1; j < input.length(); j++) {
                            // 下一个字符,判断与上一个字符是否相等
                            char next = input.charAt(j);

                            // 如果输入" "或者其他字符,则循环中断
                            if (!effectiveLetter.contains(next + "")) {
                                inputError = true;
                                break;
                            }

                            // 表示延迟
                            if (next == '/') {
                                right = j;
                                break;
                            }

                            // 如果下一个字符和当前字符相等,则进入连续按键模式
                            if (ch == next) {// 123#222235/56   i = 4,  3对应8,此时right=7,,,下次遍历从8开始
                                sameCount++;
                                right = j;
                                continue;
                            } else {// 如果下一个字符和当前字符相等,则表示连续模式结束,开始计算连续按键后输出的字母
                                break;
                            }
                        }

                        // 计算连续按键后输出的字母
                        char letter = getLetter(ch, sameCount);
                        builder.append(letter);
                        // 如果输入" "或者其他字符,则循环中断
                        if (inputError) {
                            break;
                        } else {// 计算连续按键后输出的字母完毕,开始遍历后面的字符
                            continue;
                        }
                    }
                    break;
            }
        }
        // 最后的输出内容
        System.out.println(builder);
    }

    /**
     * 根据按键和连续的次数,获取对应的字母
     *
     * @param ch        按键
     * @param sameCount 连续的次数
     */
    static final String[] mapArr = {" ",",.?!","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
    private static char getLetter(char ch, int sameCount) {
        String letter = mapArr[Integer.parseInt(String.valueOf(ch))];
        int index = (sameCount - 1) % letter.length();
        return letter.charAt(index);
    }
}

六、效果展示

1、输入

123#2222#3#5//5556

2、输出

123a3jlm

3、说明

  1. 遍历字符串123#2222#3#5//5556;
  2. #表示切换模式,/表示延迟;
  3. 123 --> 123;
  4. #切换到英文模式;
  5. 2222 --> a;
  6. #再次切换数字模式,3 --> 3;
  7. #再次切换英文模式,5 --> j;555 --> l;
  8. 6 --> m;
  9. 最后输出123a3jlm

在这里插入图片描述


🏆下一篇:华为OD机试 - 最长的顺子 - 感谢@禁止你发言提供的更简便算法(Java 2023 B卷 200分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows(Microsoft)win电脑装Xcode方法

你想在你的Windows电脑上体验和使用苹果的Xcode进行应用打包。遗憾的是&#xff0c;Xcode官方只支持macOS操作系统&#xff0c;但别担心&#xff0c;我们有替代方案可以让你在Windows环境下进行iOS应用的开发和打包。接下来我将指导你如何实现这一目标。 图片来源&#xff1a;W…

Pyside2 (Qt For Python)进度条功能实现

Pyside2 (Qt For Python)进度条功能实现 进度条&#xff08;QProgressBar&#xff09; 今天来介绍PySide2进度条&#xff08;QProgressBar&#xff09;的使用&#xff0c;如下所示&#xff1a; 说明 进度条也是一个常用的控件&#xff0c;当程序需要做一件比较耗费时间的任…

【SpringCloud篇】Eureka服务的基本配置和操作

文章目录 &#x1f339;简述Eureka&#x1f6f8;搭建Eureka服务⭐操作步骤⭐服务注册⭐服务发现 &#x1f339;简述Eureka Eureka是Netflix开源的一个基于REST的服务治理框架&#xff0c;主要用于实现微服务架构中的服务注册与发现。它由Eureka服务器和Eureka客户端组成&#…

15+铁死亡超高分推荐,快来码思路

今天给同学们分享一篇生信文章“Polydopamine Nanoparticles Targeting Ferroptosis Mitigate Intervertebral Disc Degeneration Via Reactive Oxygen Species Depletion, Iron Ions Chelation, and GPX4 Ubiquitination Suppression”&#xff0c;这篇文章发表在Adv Sci (Wei…

laravel记录mysql日志最便捷的办法

因为页面执行的sql很多&#xff0c;因此决定记录一下执行的sql语句。最简便快速的方式就是使用下面的代码&#xff1a; app\Providers\AppServiceProvider.php 在boot方法里面加上下面的代码&#xff1a; \DB::listen(function ($query) {$tmp str_replace(?, ".%s.&quo…

老师如何管理学生?

老师可以通过以下几点来管理学生&#xff1a; 1. 建立积极的关系&#xff1a;老师应该与学生建立积极的关系&#xff0c;鼓励学生参与课堂和课外活动&#xff0c;热情地回应学生的问题和需求。 2. 设定明确的规则&#xff1a;老师应该制定明确的课堂和学校规则&#xff0c;并向…

第一篇:MongoDB的安装、启动、关闭、链接shell

目录 简介 安装 安装遇到的问题 查看brew 当前使用的源&#xff1a; 更换brew 源。更换成清华大学镜像源 版本查看 MongoDB 数据目录与日志目录 启动方式一&#xff1a; 启动MongoDB 验证MongoDB 是否正常运行 停止或重新启动 停止MongoDB 服务 重新启动MongoDB服…

向量数据库有什么意义?AWS向量引擎的优势解析与未来展望

向量数据库是一种以向量为基础的数据库&#xff0c;它的出现为数据存储和检索带来了巨大的改进和创新。在传统的关系型数据库中&#xff0c;数据是以表格形式存储的&#xff0c;而向量数据库采用了更先进的数据结构&#xff0c;将数据以向量的形式进行存储和索引。 那么&#x…

从零开始,轻松实现Python接口自动化测试(基于PyCharm)

1.接口清单整理 &#xff08;1&#xff09;请求&#xff1a; 请求URL请求方法请求参数请求报文 &#xff08;2&#xff09;响应 状态码响应数据 2.用例设计 &#xff08;1&#xff09;单接口测试用例 模板&#xff1a;id、模块、接口名称、请求URL、用例名称、请求方法、…

PySpark开发环境搭建常见问题及解决

PySpark环境搭建常见问题及解决 1、winutils.exe问题2、SparkURL问题3、set_ugi()问题 本文主要收录PySpark开发环境搭建时常见的一些问题及解决方案&#xff0c;并收集一些相关资源 1、winutils.exe问题 报错摘要&#xff1a; WARN Shell: Did not find winutils.exe: {} ja…

配置集群免密登录

文章目录 前言配置集群免密登录1. 设置主机名与 IP 地址的映射关系2. 生成 SSH 密钥对3. 将公钥复制到集群节点4. 测试免密登录5. 配置节点之间互相免密登录 总结 前言 本文介绍了如何配置集群之间免密登录&#xff0c;以便在搭建集群环境时方便地进行节点之间的通信。通过设置…

力扣面试经典150题——Unix简化路径

https://leetcode.cn/problems/simplify-path/description/?envTypestudy-plan-v2&envIdtop-interview-150 思路&#xff1a;将串以/分割&#xff0c;判断字符串是…/./其他&#xff0c;进行入栈和出栈&#xff0c;最后留下的就是结果&#xff0c;拼装一下就好了。 三个…

Python的内置数据类型有哪些?

目录 一、数字类型 二、字符串类型 三、列表类型 四、元组类型 五、字典类型 六、集合类型 七、布尔类型 八、None类型 九、迭代器和生成器 总结 Python是一种高级编程语言&#xff0c;它具有丰富的内置数据类型。这些数据类型包括数字、字符串、列表、元组、字典、集…

Tubulysin F微管蛋白抑制剂 F 368870-67-1星戈瑞

Tubulysin F 是从粘细菌 Archangium geophyra 和 Angiococcus disciformis 中分离出来的天然产物。Tubulysin F 是一种具有细胞毒性活性的微管蛋白抑制剂&#xff0c;可抑制微管蛋白聚合并导致细胞周期停滞和细胞凋亡。 英文名称&#xff1a;Tubulysin F 中文名称&#xff1a;…

华为认证 | 11月底这门HCIP认证正式发布!

华为认证openGauss高级工程师HCIP-openGauss V1.0&#xff08;中文版&#xff09;自2023年11月30日起&#xff0c;正式在中国区发布。 01 发布概述 基于“平台生态”战略&#xff0c;围绕“云-管-端”协同的新ICT技术架构&#xff0c;华为公司打造了覆盖ICT领域的认证体系&…

C //例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。

C程序设计 &#xff08;第四版&#xff09; 谭浩强 例10.2 例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法&#xff1a;使用指针&#xff0c;函数的模块化设计&#xff0c;动态分…

基础课18——表格问答引擎

1.定义 表格问答引擎是一种针对结构化二维表的知识问答引擎&#xff0c;它可以基于表格内容快速抽取信息&#xff0c;并回答用户提出的问题。表格问答引擎的核心技术包括自然语言处理和机器学习等&#xff0c;它通过对表格数据的处理和分析&#xff0c;能够实现自动化问答的目…

外包干了3年,技术退步太明显了。。。

简单的说下&#xff0c;我大学的一个同学&#xff0c;毕业后我自己去了自研的公司&#xff0c;他去了外包&#xff0c;快3年了我薪资、技术各个方面都有了很大的提升&#xff0c;他在外包干的这3年人都要废了&#xff0c;技术没一点提升&#xff0c;学不到任何东西&#xff0c;…

软件工程之架构设计

从公众号转载&#xff0c;关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、架构设计的目的 1.什么是复杂的软件项目 复杂的软件项目通常有两个特点&#xff1a; 需求不确定 技术复杂 技术的复杂性主要体现在四个方面…

【每日一题】最小化旅行的价格总和

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;深搜动态规划 写在最后 Tag 【深搜动态规划】【树】【2023-12-06】 题目来源 2646. 最小化旅行的价格总和 题目解读 有一棵无向、无根的树&#xff0c;树中的节点从 0 到 n-1&#xff0c;每个节点有一个关联的价格&a…