计算误码率

题目描述

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

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

字符串会被压缩,

例:"2A3B4D5X1Z"表示"AABBBDDDDXXXXXZ"用例会保证两个输入字符串解压后长度一致,解压前的长度不一定一致

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

输入描述

两行,分别为两种字符串的压缩形式。每行字符串(压缩后的)长度<100000

输出描述

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

备注

注意:展开后的字符串不含数字

用例1

输入
3A3B
2A4B
输出
1/6
说明
无

用例2

输入
5Y5Z
5Y5Z
输出
0/10
说明
无

用例3

输入
4Y5Z
9Y
输出
5/9
说明
无

用例4

输入
4Y5Z
9Y
输出
5/9
说明
无

题目解析:

解题思路

1、将压缩的数据全部解析完比较不同的数量【由于解压之后数据量可能很大,会导致超时问题】
2、直接比较压缩的数据:
① 拆分压缩的数据放入队列中:
例如:
str1 : 4Y5Z -> queue: [‘4Y’,‘5Z’]
str2 : 9Y -> queue: [‘9Y’]
② 从队列中不断去取数据,比较【先比较数字大小一致,再比较字符是否一致】之后多余部分再写入队列中,将不同的部分写入队列中
str1 : queue: [‘5Z’]
str2 : queue: [‘5Y’]

java实现

package com.HW;

import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

/**
 * @ClassName : T001
 * @Author : kele
 * @Date: 2023/10/22 9:09
 * @Description :
 */
public class T001 {

    public static int err = 0;
    public static int all = 0;

    public static void main(String[] args) {

        String s1 = "4Y5Z";
        String s2 = "9Y";
        handle(s1,s2);
        System.out.println(""+err+"/"+ all);

    }

    public static void handle(String str1, String str2) {

        Queue<String> stack1 = new LinkedList<>();
        Queue<String> stack2 = new LinkedList<>();

        for (String s : str1.split("(?<=\\D)(?=\\d)")) {
            stack1.add(s);
            int i = Integer.parseInt(s.split("(?<=\\d)(?=\\D)")[0]);
            all += i;
        }

        for (String s : str2.split("(?<=\\D)(?=\\d)")) {
            stack2.add(s);
        }

        while (!stack1.isEmpty()) {
            String pop1 = stack1.poll();
            String[] split = pop1.split("(?<=\\d)(?=\\D)");
            int num1 = Integer.parseInt(split[0]);
            String char1 = split[1];

            String pop2 = stack2.poll();
            String[] split2 = pop2.split("(?<=\\d)(?=\\D)");
            int num2 = Integer.parseInt(split2[0]);
            String char2 = split2[1];

            if (num1 == num2) {
                if (!char1.equals(char2)) {
                    err += num1;
                }
            } else if (num1 > num2) {

                int num = num1 - num2;
                if (!char1.equals(char2)) {
                    err += num2;
                }
                stack1.add(num + char1);
            } else {
                int num = num2 - num1;
                if (!char1.equals(char2)) {
                    err += num1;
                }
                stack2.add(num + char1);
            }
        }

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值