
华为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、具体步骤:
- 解压缩字符串: 
  
- 将压缩的字符串解压成实际的字符串序列。
 - 压缩字符串的格式为:数字+字母的组合,表示字母重复的次数,例如 “3A4B” 解压后为 “AAABBBB”。
 - 由于数字可能是多位的,例如 “12A” 表示 “AAAAAAAAAAAA”,所以需要处理多位数字。
 
 - 比较两个解压后的字符串: 
  
- 比较解压后的两个字符串,统计它们在每个位置上的不同字符数(误码)。
 
 - 计算误码率: 
  
- 误码率的公式为:错误的字符数量 / 解压后的总长度。
 
 
六、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在线答疑。















![[进阶]面向对象之 包 final](https://i-blog.csdnimg.cn/direct/3ac679eb6f7b42bb85facecc009cdeaf.png)



