华为OD试题一(磁盘容量排序、数大雁、计算疫情扩散时间)

1. 磁盘容量排序

题目描述:
	磁盘的容量单位常用的有M,G,T这三个等级,它们之间的换算关系为1T = 
	1024G,1G = 1024M,现在给定n块磁盘的容量,请对它们按从小到大的顺序进
	行稳定排序,例如给定5块盘的容量,1T,20M,3G,10G6T,3M12G9M排序	
	后的结果为20M,3G,3M12G9M,1T,10G6T。注意单位可以重复出现,上述
	3M12G9M表示的容量即为3M+12G+9M,和12M12G相等。

参考代码:

# 测试数据
test_data = ['2G4M','3M2G','1T']
# 核心是将其划归为统一的单位M
# 单位字典
unit_dict = {
	'T':1024 * 1024,
	'G':1024,
	'M':1,
}
# 换算后的结果
conversion_data = []
# 换算后的结果与原结果对应关系
conversion_dict = {}

# 该函数用于换算结果
def fun(ELE):
	# 用于存放结果
	count = 0
	# 辅助指针 
	cur = 0 
	for index,ele in enumerate(ELE):
		if ele in ['T','G','M']:
			count += int(ELE[cur:int(index)]) * unit_dict[ele]
			# cur 指向下一个要换算的结果
			cur = index + 1
	return count 

# 处理测试数据
for ele in test_data:
	res = fun(ele)
	# 添加换算后的数据
	conversion_data.append(res)
	# 建立换算后的数据和源数据之间的关系
	conversion_dict[ele] = res
	
# 处理的数据排序
conversion_data.sort()

# 存放最终结果
result = []

# 将处理后的数据转化成原数据
for _ in conversion_data:
	for k,v in conversion_dict.items():
		if _ == v:
			result.append(k)
			conversion_dict.pop(k)
			break
# 打印最终结果
print(result)

2. 数大雁

题目描述:
一群大雁往南飞,给定一个字符串记录地面上的游客听到的大雁叫声,请给出叫
声最少由几只大雁发出。具体的:
1. 大雁发出的完整叫声为"quack",因为有多只大雁同一时间嘎嘎作响,所以字符
	串中可能会混合多个 "quack"。
2. 大雁会依次完整发出 "quack",即字符串中‘q’, ’u’, ’a’, ’c’, ’k’ 这 5个字母按顺序
    完整存在才能计数为一只大雁。如果不完整或者没有按顺序则不予计数。
3. 如果字符串不是由‘q’, ’u’, ’a’, ’c’, ’k’字符组合而成,或者没有找到一
    只大雁,请返回 -1。
 
核心:同过q 和 k 的位置确定大雁数量

# 测试数据
test_str1 = "quackquack"
test_str2 = "quqackuack"
test_str3 = "quackquook"

std_str = "quack"

def fun(temp):
	# 统计大雁个数
	count = 0
	# 判断非法情况
	for _ in temp:
		if _ not in std_str:
			return -1
	
	# 查找q的位置
	q_pos = []
	for pos,value in enumerate(temp):
		if value == 'q':
			q_pos.append(pos)
	# 查找k的位置
	k_pos = []
	for _ in q_pos:
		before = _
		for s in std_str:
			after = temp.find(s,before)
			# 如果没找到
			if after == -1:
				break
			if s == 'k':
				k_pos_append(after)
	# 通过分析q 的位置和其对应的k的位置计算大雁数量
	for i in range(len(q_pos)):
		if i == 0:
			count += 1
		else:
			if q_pos[i] < k_pos[i - 1]:
				count += 1
	return count 		

result = fun(str1)
print(result)

3. 计算疫情扩散时间

题目描述:在一个地图中(地图由n*n个区域组成),有部分区域被感染病菌。感
染区域每天都会把周围(上下左右)的4个区域感染。
请根据给定的地图计算,多少天以后,全部区域都会被感染。
如果初始地图上所有区域全部都被感染,或者没有被感染区域,返回-1。

核心:计算位置关系
input1 = [1, 0, 1, 0, 0, 0, 1, 0, 1]
input2 = [0, 0, 0, 0]
input3 = [1, 1, 1, 1, 1, 1, 1, 1, 1]
import math

def fun(temp_list):
	
	# 全为0 的情况
	if all(x == 0 for x in temp_list):
		return -1
	# 全为1 的情况
	if all(x == 1 for x in temp_list):
		return -1
	# 正方形边长
	l = int(math.sqrt(len(temp_list)))
	# 统计天数
	count = 0
	while True:
		# 如果全为1 即全部感染则 退出
		if all(x == 1 for x in temp_list):
			return count
		# 计算 1 的位置
		temp_1_pos = [pos for pos,x in enumerate(temp_list) if x == 1]
		# 计算感染区域
		for i in temp_1_pos:
			# 上方区域
			if 0 <= i - l <= len(temp_list) - 1:
				if temp_list[i - l] == 0:
					temp_list[i - l] = 1
			# 左边区域
			if 0 <= i - 1 <= len(temp_list) - 1:
				if temp_list[i - 1] == 0:
					temp_list[i - 1] = 1
			# 右边区域
			if 0 <= i + 1 <= len(temp_list) - 1:
				if temp_list[i + 1] == 0:
					temp_list[i + 1] = 1
			# 下方区域
			if 0 <= i + l <= len(temp_list) - 1:
				if temp_list[i + l] == 0:
					temp_list[i + l] = 1
		count += 1
res = fun(input3)
print(res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值