华为OD机试 - 计算误码率(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

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

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

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

一、题目描述

误码率 是最常用的数据通信传输质量指标。它可以理解为“在多少位数据中出现一位差错”。

移动通信 网络中的误码率主要是指比特误码率,其计算公式如下:比特误码率 = 错误比特数 / 传输总比特数,为了简单,我们引入字符串来表示误码通信的信息,一个字符错误了,就认为出现了一个误码。

输入一个标准的字符串,和一个传输前的字符串,计算误码率。

字符串会被压缩,例如:“2A3B4D5X1Z"表示”AABBBBDDDDXXXXXZ”

用例保证两个输入字符串解压后后长度一致,解压前后的长度不一定一致。

每个生成后的字符串长度 < 1000000。

二、输入描述

两行,分别为两种字符串的压缩形式。

每行字符串(压缩后的)长度 < 1000000。

三、输出描述

一行,错误的字母数量 / 展开后的总长度

备注

注意:展开后的字符串不会为数字。

四、测试用例

测试用例1:

1、输入

3A3B 2A4B

2、输出

1/6

3、说明

第一个字符串 “3A3B” 解压为 “AAABBB”。

第二个字符串 “2A4B” 解压为 “AABBBB”。

两个解压后的字符串逐一比较,共有 6 个字符。

发现 1 个位置的字符不同(第 3 个字符),误码数为 1。

误码率 = 错误的字符数量 / 总字符长度 = 1 / 6。

测试用例2:

1、输入

5Y5Z 5Y5Z

2、输出

0/10

3、说明

两个压缩字符串 “5Y5Z” 解压后都为 “YYYYYZZZZZ”。

两个解压后的字符串完全相同,没有错误字符。

误码率 = 0 / 10,所以输出 0/10。

五、解题思路

1、题目理解

题目给出两个经过压缩编码的字符串,通过解压缩后需要判断两个字符串在解压后的误码率,即对应位置不同的字符数量占总字符数量的比例。

输入的字符串是压缩形式,例如 “2A3B” 表示 “AABBB”。我们需要将这两个压缩字符串解压成实际的字符序列,然后逐位比较它们,统计误码(不同字符)的数量。

2、具体步骤:

  1. 解压缩字符串:
    • 将压缩的字符串解压成实际的字符串序列。
    • 压缩字符串的格式为:数字+字母的组合,表示字母重复的次数,例如 “3A4B” 解压后为 “AAABBBB”。
    • 由于数字可能是多位的,例如 “12A” 表示 “AAAAAAAAAAAA”,所以需要处理多位数字。
  2. 比较两个解压后的字符串:
    • 比较解压后的两个字符串,统计它们在每个位置上的不同字符数(误码)。
  3. 计算误码率:
    • 误码率的公式为:错误的字符数量 / 解压后的总长度。

六、Python算法源码

def decompress(compressed):
    # 解压缩字符串
    expanded = []
    i = 0
    n = len(compressed)
    
    while i < n:
        num = 0
        # 解析数字部分,可能有多位数字
        while i < n and compressed[i].isdigit():
            num = num * 10 + int(compressed[i])
            i += 1
        # 当前字符是要重复的字符
        if i < n:
            ch = compressed[i]
            # 重复添加字符
            expanded.append(ch * num)
            i += 1

    return ''.join(expanded)

def main():
    # 读取输入
    compressed1 = input().strip()
    compressed2 = input().strip()

    # 解压两个字符串
    expanded1 = decompress(compressed1)
    expanded2 = decompress(compressed2)

    # 计算误码数量
    error_count = 0
    total_length = len(expanded1)  # 根据题目,长度相同

    for i in range(total_length):
        if expanded1[i] != expanded2[i]:
            error_count += 1

    # 输出结果
    print(f"{error_count}/{total_length}")

if __name__ == "__main__":
    main()

七、JavaScript算法源码

function decompress(compressed) {
    // 解压缩字符串
    let expanded = [];
    let i = 0;
    let n = compressed.length;

    while (i < n) {
        let num = 0;
        // 解析数字部分,可能有多位数字
        while (i < n && !isNaN(compressed[i])) {
            num = num * 10 + parseInt(compressed[i], 10);
            i++;
        }
        // 当前字符是要重复的字符
        if (i < n) {
            let ch = compressed[i];
            // 重复添加字符
            for (let j = 0; j < num; j++) {
                expanded.push(ch);
            }
            i++;
        }
    }

    return expanded.join('');
}

function main() {
    const fs = require('fs');
    const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
    
    // 读取输入
    let compressed1 = input[0].trim();
    let compressed2 = input[1].trim();

    // 解压两个字符串
    let expanded1 = decompress(compressed1);
    let expanded2 = decompress(compressed2);

    // 计算误码数量
    let errorCount = 0;
    let totalLength = expanded1.length; // 根据题目,长度相同

    for (let i = 0; i < totalLength; i++) {
        if (expanded1[i] !== expanded2[i]) {
            errorCount++;
        }
    }

    // 输出结果
    console.log(`${errorCount}/${totalLength}`);
}

main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* decompress(const char* compressed) {
    // 预估解压后字符串的长度
    char* expanded = malloc(1000000 * sizeof(char));
    int index = 0;
    int n = strlen(compressed);
    int i = 0;
    
    while (i < n) {
        int num = 0;
        // 解析数字部分,可能有多位数字
        while (i < n && compressed[i] >= '0' && compressed[i] <= '9') {
            num = num * 10 + (compressed[i] - '0');
            i++;
        }
        // 当前字符是要重复的字符
        if (i < n) {
            char ch = compressed[i];
            // 重复添加字符
            for (int j = 0; j < num; j++) {
                expanded[index++] = ch;
            }
            i++;
        }
    }
    expanded[index] = '\0';
    return expanded;
}

int main() {
    char compressed1[1000000];
    char compressed2[1000000];

    // 读取输入
    scanf("%s", compressed1);
    scanf("%s", compressed2);

    // 解压两个字符串
    char* expanded1 = decompress(compressed1);
    char* expanded2 = decompress(compressed2);

    // 计算误码数量
    int errorCount = 0;
    int totalLength = strlen(expanded1); // 根据题目,长度相同

    for (int i = 0; i < totalLength; i++) {
        if (expanded1[i] != expanded2[i]) {
            errorCount++;
        }
    }

    // 输出结果
    printf("%d/%d\n", errorCount, totalLength);

    // 释放内存
    free(expanded1);
    free(expanded2);

    return 0;
}


九、C++算法源码

#include <iostream>
#include <string>
using namespace std;

string decompress(const string& compressed) {
    string expanded;
    int n = compressed.length();
    int i = 0;

    while (i < n) {
        int num = 0;
        // 解析数字部分,可能有多位数字
        while (i < n && isdigit(compressed[i])) {
            num = num * 10 + (compressed[i] - '0');
            i++;
        }
        // 当前字符是要重复的字符
        if (i < n) {
            char ch = compressed[i];
            // 重复添加字符
            expanded.append(num, ch);
            i++;
        }
    }
    return expanded;
}

int main() {
    string compressed1, compressed2;
    // 读取输入
    cin >> compressed1 >> compressed2;

    // 解压两个字符串
    string expanded1 = decompress(compressed1);
    string expanded2 = decompress(compressed2);

    // 计算误码数量
    int errorCount = 0;
    int totalLength = expanded1.length(); // 根据题目,长度相同

    for (int i = 0; i < totalLength; i++) {
        if (expanded1[i] != expanded2[i]) {
            errorCount++;
        }
    }

    // 输出结果
    cout << errorCount << "/" << totalLength << endl;

    return 0;
}



🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

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

在这里插入图片描述

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

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

相关文章

怎么将几个pdf合成为一个?把几个PDF合并成为一个的8种方法

怎么将几个pdf合成为一个&#xff1f;将多个PDF文件合并成一个整体可以显著提高信息整合的效率&#xff0c;并简化文件的管理与传递。例如&#xff0c;将不同章节的电子书合成一本完整的书籍&#xff0c;或者将多个部门的报告整合成一个统一的文档&#xff0c;可以使处理流程变…

CCS811二氧化碳传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 ccs811.h文件 ccs811.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 CCS811模块是一种气体传感器&#xff0c;可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…

6.接口测试加密接口(Jmeter/工具/函数助手对话框、Beanshell脚本)

一、接口测试加密接口&#xff0c;签名接口 1.加密算法&#xff1a; 可以解密的&#xff1a; 对称式加密&#xff08;私钥加密&#xff09;&#xff1a;AES&#xff0c;DES&#xff0c;Base64 https://www.bejson.com 非对称加密&#xff08;双…

Fisco Bcos 2.11.0通过网络和本地二进制文件搭建单机节点联盟链网络(搭建你的第一个区块链网络)

Fisco Bcos 2.11.0通过网络和本地二进制文件搭建单机节点联盟链网络(搭建你的第一个区块链网络) 文章目录 Fisco Bcos 2.11.0通过网络和本地二进制文件搭建单机节点联盟链网络(搭建你的第一个区块链网络)前言一、Ubuntu依赖安装二、创建操作目录, 下载build_chain.sh脚本2.1 先…

Linux-Swap分区使用与扩容

一、背景 在Linux系统中&#xff0c;swap空间&#xff08;通常称为swap分区&#xff09;是一个用于补充内存资源的重要组件。当系统的物理RAM不足时&#xff0c;Linux会将一部分不经常使用的内存页面移动到硬盘上的swap空间中&#xff0c;这个过程被称为分页&#xff08;paging…

【JavaEE初阶】多线程(4)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 线程安全的 第四个原因 代码举例: 分析原因 解决方法 方法1 方法2 wait(等待)和notify(通知) wait和sleep区别 线程安全的 第四个原因 内存可见性,引起的线程安全问…

CloudXR 套件扩展 XR 工作流

NVIDIA为开发者提供了一个先进的平台&#xff0c;开发者可以在该平台上使用全新NVIDIA CloudXR 套件来创建可扩展、品牌化的定制扩展现实&#xff08;XR&#xff09;产品。 NVIDIA CloudXR 套件基于全新架构而打造&#xff0c;是扩展XR生态的重要工具。它为开发者、专业人士和…

彻底理解浅拷贝和深拷贝

目录 浅拷贝实现 深拷贝实现自己手写 浅拷贝 浅拷贝是指创建一个新对象&#xff0c;这个对象具有原对象属性的精确副本 基本数据类型&#xff08;如字符串、数字等&#xff09;&#xff0c;在浅拷贝过程中它们是通过值传递的&#xff0c;而不是引用传递&#xff0c;修改值并不…

Git项目管理工具

分布式版本控制系统

数据集 wider person 户外密集行人检测 >> DataBall

数据集 wider person 用于野外密集行人检测的多样化数据集 行人检测 目标检测 户外密集行人检测的多样化数据集 WiderPerson: A Diverse Dataset for Dense Pedestrian Detection in the Wild article{zhang2019widerperson, Author {Zhang, Shifeng and Xie, Yiliang and Wa…

常用环境部署(二十)——docker部署OpenProject

一、安装Docker及Docker-compose https://blog.csdn.net/wd520521/article/details/112609796 二、docker拉取OpenProject镜像 1、拉取镜像 docker pull openproject/openproject:14 注意&#xff1a; 拉取镜像的时候会有超时的现象出现&#xff0c;大家重新拉取几次就行…

链式二叉树的基本操作(C语言版)

目录 1.二叉树的定义 2.创建二叉树 3.递归遍历二叉树 1&#xff09;前序遍历 2&#xff09;中序遍历 3&#xff09;后序遍历 4.层序遍历 5.计算节点个数 6.计算叶子节点个数 7.计算第K层节点个数 8.计算树的最大深度 9.查找值为x的节点 10.二叉树的销毁 从二叉树…

分贝转换 1 mVpp = 9.03dBmV

分贝转换 1 mVpp 9.03dBmV 函数发生器调节如下参数在频谱仪器上能看到9.03dBmv的电压值函数发生器产生 30mVpp 频谱仪会显示多少dBmV 函数发生器调节如下参数 输出频率&#xff1a;10 MHz 波形类型&#xff1a;正弦波 阻抗&#xff1a;50 Ω 幅度&#xff1a;1 mVpp …

【计算机网络 - 基础问题】每日 3 题(六)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

回溯-重新安排行程

1.排序 Collections.sort(list,(o1, o2)-> o1.get(0).compareTo(o2.get(0))); 2.返回值 3.往集合添加元素 Arrays.asList(元素) List<List<String>> list new ArrayList<>();List<String> path new ArrayList<>();// 将[["JFK"…

影刀RPA实战:网页爬虫之CSDN博文作品数据

今天我们使用影刀来采集网页数据&#xff0c;影刀RPA是一款功能强大的自动化办公软件&#xff0c;它可以模拟人工的各种操作&#xff0c;帮助企业自动处理大量重复性、有逻辑规则的工作。影刀RPA在网页数据采集方面表现出色&#xff0c;能够实现对任何桌面软件、Web程序的自动化…

Python基础语法(1)上

常量和表达式 我们可以把 Python 当成一个计算器&#xff0c;来进行一些算术运算。 print(1 2 - 3) print(1 2 * 3) print(1 2 / 3) 这里我们可能会有疑问&#xff0c;为什么不是1.6666666666666667呢&#xff1f; 其实在编程中&#xff0c;一般没有“四舍五入”这样的规则…

第 13 章 兵马未动,粮草先行——InnoDB 统计数据是如何收集的

表的统计数据&#xff1a;SHOW TABLE STATUS LIKE table_name; 索引的统计数据&#xff1a;SHOW INDEX FROM table_name; 13.1 两种不同的统计数据存储方式 InnoDB 提供了两种存储统计数据的方式&#xff1a; 永久性的统计数据。存储在磁盘上&#xff0c;服务器重启之后还在…

华为 HCIP 认证费用和报名资格

在当今竞争激烈的信息技术领域&#xff0c;华为 HCIP认证备受关注。它不仅能提升个人的技术实力与职业竞争力&#xff0c;也为企业选拔优秀人才提供了重要依据。以下将详细介绍华为 HCIP 认证的费用和报名资格。 一、HCIP 认证费用 华为HCIP认证的费用主要由考试费和培训费构成…

Maven下载安装

下载 下载地址&#xff1a;Maven – Download Apache Maven 选择合适的版本进行下载 windows&Linux安装 1, 解压apache-maven-3.6.1.rar即安装完成 2&#xff0c; 配置环境变量MAVEN_HOME为安装路径&#xff0c;并将MAVEN_HOME的bin目录配置到PATH下 3&#xff0c;…