华为OD机试 - 字符串编码校验(Java 2024 D卷 100分)

news2024/9/29 15:33:58

在这里插入图片描述

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

专栏导读

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

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

题目描述

有一种校验证码机制,用于数据传输中的数据完整性检查,规则如下:

  • 在字符串中插入一些数字作为校验证码,每个数字之后跟随对应个数的字符;
  • 要求有校验证码(校验证码大于零并且无前导零),并且正确匹配,无歧义:如,“helloworld” 在插入校验证码之后可以为 “5hello5world”,即 5 + “hello” + 5 + “world”;

但是,有些字符串在进行校验时会产生歧义,比如 “109something” 可以校验为 10 + “9something” 或者 1 + “0” + 9 + “something”,故这类编码方式是有歧义的。

现给出一个字符串 encodedString,请判断这个字符串是否符合上述规则:

  • 如果是,则返回去掉校验码后的字符串长度;
  • 如果不是,则返回 -1。

二、测试用例

测试用例1:

1、输入

9computer012

2、输出

10

3、说明

只可以解析为 9 + “computer0” + 1 + “2”,可以正确匹配(校验证码与随后字符个数相同)且无歧义。返回去掉校验码后的字符串 “computer02” 的长度 10。

测试用例2:

1、输入

118computer1a

2、输出

-1

3、说明

可以解析为 11 + “8computer1a” 或 1 + “1” + 8 + “computer” + 1 + “a”,有两种解析方式,所以有歧义。

五、解题思路

题目的核心是对包含校验码的字符串进行验证,并去除校验码,返回去除校验码后的字符串长度。如果字符串不符合校验规则或存在歧义,则返回 -1。

1、解题步骤

  1. 检查输入字符串:
    • 如果输入字符串为空,返回0,因为没有校验码。
    • 如果字符串的第一个字符不是有效的校验码(1-9),返回 -1。
  2. 初始化数据结构:
    • 使用 List 保存可能的解析结果。
    • 使用 StringBuilder 累积当前的校验码字符。
  3. 遍历字符串:
    • 逐字符遍历输入字符串。
    • 如果当前字符是数字字符,将其添加到 checksum 中,形成当前的校验码。
    • 将累积的 checksum 转换为整数,表示后续字符串段的长度。
    • 检查当前解析位置后剩余字符串是否足够长,不足则跳过当前解析。
    • 对剩余字符串进行递归解析,获取剩余部分的长度。
    • 如果递归解析成功,将当前段长度和剩余段长度相加,并添加到 results 列表中。
    • 如果当前字符不是数字字符,结束循环,因为校验码已经结束,接下来应该是字符串段。
  4. 结果判断:
    • 检查 results 列表的大小,如果列表中只有一个结果,则返回该结果,表示解析成功且无歧义。
    • 如果列表中有多个结果或为空,返回 -1,表示解析失败或存在歧义。

2、关键点

(1)递归解析:对每一段进行递归解析,以验证剩余部分是否符合校验规则。

(2)歧义检测:通过检查 results 列表的大小来确定是否存在歧义。

(3)长度校验:在每一步都检查剩余字符串的长度,以确保不会超出范围。

六、Java算法源码

public class OdTest02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象以读取用户输入

        String inputString = scanner.nextLine(); // 从控制台读取输入字符串
        int length = validateChecksum(inputString); // 调用validateChecksum方法进行校验

        System.out.println(length); // 输出校验结果
    }

    public static int validateChecksum(String inputString) {
        if (inputString.isEmpty()) { // 如果输入字符串为空,返回0
            return 0;
        }

        // 检查输入字符串的第一个字符是否是有效的校验码(1-9)
        if (inputString.charAt(0) < '1' || inputString.charAt(0) > '9') {
            return -1; // 如果不是有效的校验码,返回-1
        }

        List<Integer> results = new ArrayList<>(); // 用于存储各个解析结果的列表
        StringBuilder checksum = new StringBuilder(); // 用于累积当前的校验码

        for (int i = 0; i < inputString.length(); i++) { // 遍历输入字符串中的每一个字符
            char currentChar = inputString.charAt(i); // 获取当前字符

            if (currentChar >= '0' && currentChar <= '9') { // 如果当前字符是数字
                checksum.append(currentChar); // 将当前字符追加到校验码中

                int segmentLength = Integer.parseInt(checksum.toString()); // 将校验码转换为整数,表示后面段的长度
                if (i + segmentLength + 1 > inputString.length()) continue; // 如果超出字符串长度,继续下一个字符

                // 递归调用validateChecksum方法以解析剩余部分
                int remainingLength = validateChecksum(inputString.substring(i + segmentLength + 1));
                if (remainingLength == -1) continue; // 如果解析失败,继续下一个字符

                // 解析成功,将当前段长度和剩余段长度相加,并添加到结果列表中
                results.add(segmentLength + remainingLength);
            } else {
                break; // 如果遇到非数字字符,结束循环
            }
        }

        // 如果结果列表中只有一个元素,返回该元素值,否则返回-1表示失败
        return results.size() == 1 ? results.get(0) : -1;
    }
}

七、效果展示

1、输入

9computer012

2、输出

10

3、说明

只可以解析为 9 + “computer0” + 1 + “2”,可以正确匹配(校验证码与随后字符个数相同)且无歧义。返回去掉校验码后的字符串 “computer02” 的长度 10。

在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 D卷 200分)

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

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity3D 物体圆周运动

Unity3D 实现一个 2D 物体沿着圆周进行运动。 物体圆周运动 前段时间在开发一个小游戏时&#xff0c;需要实现火箭沿着一个圆形轨道进行圆周运动。 以前面试的时候也被问到过这类问题&#xff08;如何让一个 2D 物体做圆周运动&#xff09;&#xff0c;所以还是记录一下实现…

ICML 2024 | 矛与盾的较量!北大提出提示无关数据防御保护算法PID

文章链接&#xff1a;https://arxiv.org/pdf/2406.15305 代码地址&#xff1a;https://github.com/PKU-ML/Diffusion-PID-Protection 亮点直击 本文在实证观察中发现&#xff0c;保护阶段和利用阶段之间的提示不匹配可能会削弱当前数据保护算法的有效性。本文深入探讨了利用LDM…

【机器学习第7章——贝叶斯分类器】

机器学习第7章——贝叶斯分类器 7.贝叶斯分类器7.1贝叶斯决策论7.2 朴素贝叶斯分类器条件概率的m估计 7.3 极大似然估计优点基本原理 7.4 贝叶斯网络7.5 半朴素贝叶斯分类器7.6 EM算法7.7 EM算法实现 7.贝叶斯分类器 7.1贝叶斯决策论 一个医疗判断问题 有两个可选的假设&#…

从日常到专业,2024年必备在线翻译神器

现在全球交流越发的简单、频繁&#xff0c;很多时候外语成为了我们汲取新鲜知识的绊脚石。这时候我们就可以借助一些翻译在线的工具来解决这个问题。这次我们一起探索几款我搜集到的翻译工具。 1.福晰在线翻译 链接直通&#xff1a;https://fanyi.pdf365.cn/doc 这个工具支…

本地部署启动PmHub

文章目录 相关配置版本关系拉取代码使用Git clone下载源码 MYSQL配置Nacos配置Windows本地下载也可以Docker部署Nacos持久化配置启动Nacos访问Nacos Redis配置RocketMQ配置新建相应目录rocketmq, 然后在里面新建broker文件夹, 放broker.conf在 rocketmq 新建 data 文件夹&#…

MRAM FRAM在医疗设备场景的应用

便携式超声波扫描仪是一种检测从物体反射的声波并将其转换为实时图像的设备。通常使用配置存储器和图像/报告存储器两种类型的存储器。配置存储器存储来自外部硬件的标识和配置信息&#xff0c;图像/报告存储器存储图像和相应的报告数据。这些存储器即使在突然断电的情况下&…

MySQL介绍和安装与配置

文章目录 MySQL介绍什么是数据库什么是关系型数据库什么是非关系型数据库MySQL概述和历史 MySQL安装和配置在线安装方式MySQL5.7的安裝1.下载yum Repository2.安装yum Repository3.安装mysql5.7的服务3.后续命令 离线安装方式1、卸载已有的MySQL文件2、安装mysql3、后续命令 修…

详细分析Python生成项目依赖包的工具

目录 前言1. pipreqs2. pip freeze3. poetry4. conda5. 总结 前言 在Python项目开发中&#xff0c;管理依赖包是确保项目正常运行的关键步骤 本博客将详细分析几种流行的依赖管理工具&#xff0c;包括 pipreqs、pip freeze、poetry 和 conda&#xff0c;以及它们的使用场景和…

智能硬件创新实训平台-嵌入式、物联网、移动互联网、人工智能实验实训教学平台

智能硬件是继智能手机之后的一个科技概念&#xff0c;通过软硬件结合的方式&#xff0c;对传统设备进行改造&#xff0c;进而让其拥有智能化的功能。智能化之后&#xff0c;硬件具备连接的能力&#xff0c;实现互联网服务的加载&#xff0c;形成“云端”的典型架构&#xff0c;…

黑马Java零基础视频教程精华部分_11_面向对象进阶(3)_抽象类、接口、适配器

《黑马Java零基础视频教程精华部分》系列文章目录 黑马Java零基础视频教程精华部分_1_JDK、JRE、字面量、JAVA运算符 黑马Java零基础视频教程精华部分_2_顺序结构、分支结构、循环结构 黑马Java零基础视频教程精华部分_3_无限循环、跳转控制语句、数组、方法 黑马Java零基础视…

【Linux】文件变身大作战:Linux下的文件重命名艺术

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;文件变身大作战&#xff1a;Linux下的文件重命名艺术 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法…

OpenGL3.3_C++_Windows(33)

PBR渲染管线 Physically Based Rendering渲染管线 :使用一种更符合物理学规律的算法模型来模拟光线&#xff0c;由于它与物理性质非常接近&#xff0c;可以直接以物理参数为依据来编写表面材质判断是否基于物理的渲染,有三个数学模型&#xff1a;微平面&#xff0c;能量守恒&a…

Go语言实现支持泛型的二分查找算法

二分查找基本原理图&#xff1a; 参考代码&#xff1a; 泛型的定义&#xff1a; package v2024type Integer interface {int | int8 | int16 | int32 | int64 | uint | uint8 | uint16 | uint32 | uint64 }type Float interface {float32 | float64 }type Number interface …

无需变更环境变量,一键管理和运行不同JDK版本的jar包

前言 之前公司的项目一直用的都是JDK8&#xff0c;然后前段时间&#xff0c;公司要求以后的新项目必须要用JDK17及以上的版本。但是以前的旧项目还有很多都在维护。 这样子的话&#xff0c;电脑上就至少有两个版本的JDK了。我想在不变动环境变量的情况下&#xff08;环境变量…

可穿戴设备与健康科技:迈向个性化医疗的未来

在数字化和智能化浪潮的推动下&#xff0c;可穿戴设备与健康科技正迅速改变我们的健康管理方式。这些设备不仅使我们能够实时监测健康指标&#xff0c;还为个性化医疗提供了宝贵的数据支持。本文将详细探讨可穿戴设备的作用、健康监测技术的发展、个性化医疗的趋势&#xff0c;…

代码随想录——买卖股票的最佳时机含冷冻期(Leetcode 309)

题目链接 动态规划 class Solution {public int maxProfit(int[] prices) {if(prices.length 0 || prices.length 1){return 0;}// 初始化int[][] dp new int[prices.length 1][2];dp[1][0] -prices[0];for(int i 2; i < prices.length; i){dp[i][0] Math.max(dp[…

Arduino PID库 (5):开启或关闭 PID 控制的影响

Arduino PID库 &#xff08;5&#xff09;&#xff1a;开启或关闭 PID 控制的影响 Arduino PID库 &#xff08;4&#xff09;&#xff1a;Reset Windup 问题 尽管拥有一个PID控制器很好&#xff0c;但有时你并不关心它要说什么。 PID On - User Overwritting Output&#x…

安全测试:保护系统免受攻击和数据泄露

目录 前言1. 安全测试的概念2. 安全测试的主要作用2.1 发现安全漏洞2.2 评估风险2.3 确保合规性2.4 提高安全意识 3. 安全测试在整个测试中的地位4. 常用的安全测试工具4.1 渗透测试工具4.1.1 Metasploit4.1.2 Burp Suite 4.2 漏洞扫描工具4.2.1 Nessus4.2.2 OpenVAS 5. 安全测…

通道加密机的定义与功能

通道加密机是一种用于保护数据传输过程中安全性的硬件设备&#xff0c;它通过加密技术确保数据在通道中传输时不被非法截获或篡改。以下是对通道加密机的详细解析&#xff1a; 一、定义与功能 通道加密机是一种专门设计用于加密和解密在特定通信通道上传输的数据的设备。它能够…

【网络安全】|pgp的安装和使用

1、pgp的安装&#xff1a; 参考&#xff1a; https://jingyan.baidu.com/article/86fae346c289173c49121a11.html 实际操作&#xff1a; 在第六步中有不同&#xff0c; 第5步重启后&#xff0c;打开pgp desktop, 可以看到如图&#xff1a; 此时需要做两件事&#xff1a; 1、将…