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

news2024/11/15 19:26:33

在这里插入图片描述

华为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在线答疑。

在这里插入图片描述

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

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

相关文章

Acwing 队列

模拟队列 主要思想&#xff1a;先进先出&#xff08;注意与栈做区分&#xff09;&#xff0c;队尾插入&#xff0c;队头删除。设置一个数组存储数据&#xff0c;队头指针指向队列第一个元素&#xff08;初始为0&#xff09;&#xff0c;队尾指针指向最后一个元素&#xff08;初…

Qt常用控件——QSpinBox

文章目录 QSpinBox核心属性及信号点餐示例 QSpinBox核心属性及信号 QSpinBox或者QDoubleSpinBox表示微调框&#xff0c;带有按钮的输入框&#xff0c;可以用来输入整数/浮点数或者通过点击按钮调整数值大小 QSpinBox和QDoubleSpinBox用法基本相同&#xff0c;本篇以QSpinBox为…

Ubuntu 安装包下载(以20版本 阿里镜像站为例子)

Ubuntu安装包下载 上一篇文章写了一些国内常用的镜像站&#xff0c;这篇以阿里云镜像站Ubuntu20版本为例。 https://mirrors.aliyun.com/ubuntu-releases/ 1.点击自己想要下载的版本 2.点击以amd64.iso为结尾的文件&#xff0c;这个是安装文件&#xff0c;如果是桌面端&…

C++初阶学习——探索STL奥秘——vector的模拟实现

vector的结构比较特殊&#xff0c;成员变量为三个指针 #pragma once #include <iostream> using std::cin; using std::cout; using std::endl;#include <string> using std::string;namespace Yohifo {template<class T>class vector{public:typedef T val…

使用jmeter做性能测试实践过程中需要注意什么

前言 在驾驭Apache JMeter进行性能测试之旅中&#xff0c;深刻理解其特性和限制是至关重要的。以下是提升JMeter效能的关键策略&#xff0c;旨在挖掘其潜力&#xff0c;克服局限&#xff0c;实现精准测试。 1.精确调控线程数 推荐阈值&#xff1a;将线程数控制在300以内&…

模拟视频推到WVP推流列表

效果 1. wvp创建RTMP 2. 使用ffmpeg将本地的视频转为rtmp ffmpeg -re -i F:rtsp\123.mp4 -c copy -f flv rtmp://192.168.1.237:1935/cd/10001?sign=Z4Y3eYeSg

HTML5之canvas绘图

介绍 <canvas> 是 HTML5 引入的一个强大元素&#xff0c;允许直接在网页上进行矢量图形和位图图像的绘制&#xff0c;为网页提供了一个动态图形渲染的平台。这一特性极大丰富了网页的表现力&#xff0c;特别是在数据可视化、游戏开发、交互式图表和动画制作等领域发挥着…

第311题| 超好用!二重积分求旋转体体积公式|武忠祥老师每日一题

第一步&#xff1a; &#xff08;1&#xff09;找渐近线&#xff0c;先看水平渐近线&#xff0c;看x趋于无穷时&#xff0c;y有没有趋于一个有限的值。 , 得出水平渐近线y1。因为左右两边都是水平渐近线&#xff0c;所以没有斜渐近线。 第二步&#xff1a; 画出图像&#…

Spring Boot环境下的学生读书笔记共享

第4章 系统设计 4.1系统结构设计 读书笔记共享平台的设计主要是为了满足用户的实际需求。 因此&#xff0c;它需要通过Internet实现&#xff0c;因此它必须具备硬件和软件基础。该平台最终可以通过科学技术和各种方式达到支持智能化的信息管理的目的。因此&#xff0c;它必须具…

深入理解Python中的生成器:高效迭代与延迟计算的艺术

在处理大量数据时&#xff0c;如何有效地管理内存成为了一个关键问题。Python中的生成器&#xff08;Generator&#xff09;提供了一种优雅的解决方案&#xff0c;它允许你在迭代过程中按需生成数据&#xff0c;而不是一次性加载所有数据到内存中。本文将详细探讨生成器的工作原…

看Threejs好玩示例,学习创新与技术(三)

本文接上篇内容&#xff0c;继续挖掘应用ThreeJS的一些创新算法。 1、获得鼠标移动对应的地理位置 这个算法如果放在几年前&#xff0c;那肯定会难倒一帮人的。因为是三维投影涉及矩阵变换及求逆&#xff0c;而且还是投影模式下的。在Project Texture这个示例中&#xff0c;作…

Sentaurus TCAD的sdevice求解中选择Math求解方法

目录 并行迭代线性求解器&#xff08;ILS&#xff09;并行超节点直接求解器&#xff08;ParDiSo&#xff09;超节点直接求解器&#xff08;Super&#xff09;详细解释1. 并行迭代线性求解器&#xff08;ILS&#xff09;2. 并行超节点直接求解器&#xff08;ParDiSo&#xff09;…

windows安装docker、elasticsearch、kibana、cerebro、logstash

文章目录 1. 安装docker1.1. 两大要点1.1.1. 安装启用hyper-v电脑不存在hyper-v的情况 1.1.2. 下载安装docker 2. 在docker里面安装elasticSearch&#xff0c;kibana&#xff0c;cerebro3. 安装logstash-将数据导入到elasticSearch3.1 安装logstash3.1.1 注意事项3.1.1.1. 等了…

vue3中把封装svg图标为全局组件

在vue3中我们使用svg图标是下面这样子的 <svg style="width:30px;height:30px;"><use xlink:href="#icon-phone" fill="red"></use></svg>第次使用图标都要写这么多重复的代码,很不方便,所以,如果我们把它封装成全局…

“拍照赚钱”的任务定价(2017数学建模国赛b题)

文章目录 题目说明解题思路第一问第二问第三问第四问 部分结果图项目地址 题目 赛题地址 说明 数模国赛前的练手题。其实我个人感觉这道题很散&#xff0c;都是找一些规律进行总结统计&#xff0c;最多结合一些机器学习算法进行预测拟合之类的我刚开始用matlab&#xff0c;后…

[进阶]面向对象之 包 final

文章目录 包什么是包包名的规则:什么时候需要导包 final常量 包 什么是包 包就是文件夹。用来管理各种不同功能的Java类&#xff0c;方便后期代码维护。 包名的规则: 公司域名反写包的作用&#xff0c;需要全部英文小写&#xff0c;见名知意。使用其他类时&#xff0c;需要…

基于R语言的统计分析基础:使用键盘输入数据

在R语言中&#xff0c;键盘输入数据是一种灵活且直接的数据获取方式&#xff0c;适用于处理小数据集或需要即时用户交互的场景。通常用于交互式数据探索和分析、临时数据处理、交互式图形绘制、脚本自动化中的用户交互、特定应用场景下的数据录入中。 比如利用readline()函数根…

分享一些智慧农业数据集

持续更新中》》》 1.葡萄叶片病虫害数据集 数据集信息&#xff1a;yolo格式&#xff0c;适用于直接训练YOLO目标检测模型(yolo5 yolo8 yolo9 yolo10等)。数据集是已经标注好。训练集验证集已划分好&#xff0c;包含类别标签yaml文件&#xff0c;数据集可直接用于模型训练&…

第十二周:机器学习笔记

第十二周周报 摘要Abstract机器学习1. Recurrent Neural Network&#xff08;下&#xff09;1.1 RNN的Loss Function怎么求&#xff1f;1.2 RNN奇怪的特性1.3 如何解决 RNN 梯度消失或者爆炸1.4 RNN 其他应用 Pytorch学习1. 现有的网络模型使用以及其修改1.1 在VGG16模型添加Mo…

AD原理图编译

AD原理图检查项包括&#xff1a; 1.位号重复 2.网络悬浮 3.电源悬浮 4.单端网络 网络悬浮&#xff0c;在多页原理图时会比较明显,大部分是编译范围不是全部原理图&#xff0c;导致出现该情况&#xff0c;解决方法就是修改编译范围&#xff0c;将网络识别符范围改为全部即可。…