华为OD试题六(数据最节约的备份方法、TLV解码)

1. 数据最节约的备份方法

题目描述:
有若干个文件,使用刻录光盘的方式进行备份,假设每张光盘的容量是500MB,求
使用光盘最少的文件分布方式
所有文件的大小都是整数的MB,且不超过500MB;文件不能分割、分卷打包
输入描述:
一组文件大小的数据
输出描述:
使用光盘的数量
补充说明:
不用考虑输入数据不合法的情况;假设最多100个输入文件。
示例1
输入:100,500,300,200,400
输出:3
说明:(100,400),(200,300),(500) 3张光盘即可

示例代码:

# 测试数据
test_data = [100,500,300,200,400]

def fun(s):
	# 统计个数
	count = 0
	# 移动游标
	while cur < len(s):
		if s[cur] < 500 and (500 - s[cur] in s):
			for index,value in enumerate(s):
				if value == 500 - s[cur]:
					# 使用过的数据标记为 -1
					s[index] = -1
			s[cur] = -1
			# 计数
			count += 1
		elif s[cur] == 500:
			s[cur] = -1
			count += 1	
		cur += 1
	# 统计最终结果
	count = count + (len(s) - s.count(-1))
	return count
r = fun(test_data)
print(r)

2. TLV解码

华为OD试题六(数据最节约的备份方法、TLV解码)_第1张图片
示例代码

# 测试数据
s = '31'
ss = [
	'32', '01', '00', 'AE',
    '90', '02', '00', '01', '02',
    '30', '03', '00', 'AB', '32', '31',
    '31', '02', '00', '32', '33',
    '33', '01', '00', 'CC'
]

def fun(s,ss):
	cur = 0
	# 结果列表
	res = []
	while cur < len(ss):
		Tag = ss[cur]
		length_str = ss[cur + 2] + ss[cur + 1]
		length = int(length_str,10)
		if Tag == s:
			tmp = cur + 2
			for i in range(length):
				res.append(ss[tmp + i + 1])
			break
		cur += length + 2 + 1
	return ''.join(res)
r = fun(s,ss)
print(r)

你可能感兴趣的:(OD试题,华为od,TLV解码,数据节约备份,python)