当前位置:   article > 正文

华为OD试题四(字符串统计、计算误码率、计算最大乘积)

华为od

1. 字符串统计

题目描述:
给定两个字符集合,一个为全量字符集,一个为已占用字符集。
已占用的字符集中的字符不能再使用,要求输出剩余可用字符集。
输入描述:
1、输入为一个字符串,一定包含@符号。@前的为全量字符集,@后
  的字为已占用字符集。
 2、已占用字符集中的字符一定是全量字符集中的字符。字符集中的字
 符跟字符之间使用英文逗号分隔。
 3、每个字符都表示为字符加数字的形式,用英文冒号分隔,比如a:1,
    表示1个a字符。
 4、字符只考虑英文字母,区分大小写,数字只考虑正整形,数量不
    超过100。 
 5、如果一个字符都没被占用,@标识仍然存在,例如a:3,b:5,c:2@
 输出描述:
 输出可用字符集,不同的输出字符集之间回车换行。
 示例1
 输入:a:3,b:5,c:2@a:1,b:2
 输出:a:2,b:3,c:2
 说明:全量字符集为3个a,5个b,2个c。
 	  已占用字符集为1个a,2个b。 
 	  由于已占用字符不能再使用,因此,剩余可用字符为2个a,3个b,
 	  2个c。
 	  因此输出a:2,b:3,c:2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

示例代码:

#测试数据
test_data = 'a:3,b:5,c:2@a:1,b:2'
# 拆分数据
a1,a2 = test_data.split("@")
a1_dict = { ele.split(":")[0]:ele.split(":")[1] for ele in a1.split(',')}
a2_dict = { ele.split(":")[0]:ele.split(":")[1] for ele in a1.split(",") }

for k,v in a2_dict.items():
	a1_dict[k] = str(int(a1_dict[k]) - int(a2_dict[k]))

result = []
for k,v in a1_dict.items():
	result.append("{}:{}".format(k,v))
print(','.join(result))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2. 计算误码率

题目描述:
误码率是最常用的数据通信传输质量指标。它可以理解为“在多少位数
据中出现一位差错”。
移动通信网络中的误码率主要是指比特误码率,其计算公式如下:比
特误码率=错误比特数/传输总比特数,
为了简单,我们使用字符串来标识通信的信息,一个字符错误了,就
认为出现了一个误码输入一个标准的字符串,和一个传输后的字符
串,计算误码率 
字符串会被压缩,
例如:“2A3B4D5X1Z” 表示 “AABBBDDDDXXXXXZ
用例会保证两个输入字符串解压后长度一致,解压前的长度不一定一
致。
每个生成后的字符串长度<100000000。
输入描述:
两行,分别为两种字符串的压缩形式。 每行字符串(压缩后的)长度
<100000
输出描述:
一行,错误的字符数量 / 展开后的总长度
示例1:
输入:3A3B
			2A4B
输出:1/6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

示例代码:

# 测试数据
test_data1 = '4Y5Z'
test_data2 = '9Y'
# 将码展开
def fun1(s):
	res = ''
	start = 0
	end = 0

	while start <= len(s) - 1 and end <= len(s) - 1:
		if s[end].isdigit():
			end += 1
		else:
			res = res + (int(s[start:end]) * s[end])
			end += 1
			start = end
	return res
# 计算错码率
def fun(s1,s2)
	ss1 = fun1(s1)
	ss2 = fun1(s2)
	# 统计错误的个数
	count = 0
	for a,b in zip(ss1,ss2):
		if a != b:
			count += 1
	return "{}/{}".format(str(count),str(len(ss1)))
			
res = fun(test_data1,test_data2)
print(res)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3.计算最大乘积

题目描述:
给定一个元素类型为小写字符串的数组,请计算两个没有相同字符的
元素 长度乘积的最大值,如果没有符合条件的两个元素,返回0。
输入描述:
输入为一个半角逗号分隔的小写字符串的数组,2 <= 数组长度
<=100,0 < 字符串长度<= 50。
输出描述:
两个没有相同字符的元素 长度乘积的最大值。
示例1
输入: iwdvpbn,hk,iuop,iikd,kadgpf
输出:14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

示例代码:

# 测试数据
test_data = "iwdvpbn,hk,iuop,iikd,kadgpf"
s_list = test_data.split(',')

def fun(s1,s2)
	# 计算两个字符串长度的乘积
	s1_set = set(s1)
	s2_set = set(s2)
	s = s1_set - s2_set
	if len(s) == len(s1_set):
		return len(s1) * len(s2)
	else:
		return -1

def fun1(s_list):
	result = []
	# 计算最大长度
	start = 0
	while start <= len(s_list) - 2:
		end = start + 1
		while end <= len(s_list) - 1:
			res = fun(s_list[start],s_list[end])
			if res != -1:
				result.append(res)
			end += 1
		start += 1
	return max(result)
	
r = fun1(s_list)
print(r)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/思考机器4/article/detail/62253
推荐阅读
相关标签
  

闽ICP备14008679号