华为OD机试 :磁盘容量排序

本文分享了作者在华为OD机试中遇到的第一道题——磁盘容量排序。题目要求根据M、G、T单位的关系对磁盘容量进行排序,1T=1000G,1G=1000M。虽然看似简单,但作者在实际操作中遇到了困难,提醒读者要多刷题以提升技能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天参加华为OD机试,总共有两道机试题,每道题200分,总共400分,华为那边要求是两道题全过。第一道题是磁盘容量排序,其实挺简单的,但我一直没调试好,导致心态直接崩了,后面第二题也没看,看来以后要好好刷题才行。

1.题目大意

磁盘的容量单位有M、G、T,其关系为 1T = 1000G、1G = 1000M,如样例所示先输入磁盘的个数,再依次输入磁盘的容量大小,然后按照从小到大的顺序对磁盘容量进行排序并输出。

2.样例输入

3
20M
1T
3G

3.样例输出

20M
3G
1T

4.代码实现

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int StrToInt(string str)
{
   
    if (str[str.size()
### 华为 OD 指示灯 排序 算法 实现 #### 问题分析 华为 OD 中的指示灯排序问题是典型的多条件排序问题,主要考察候选人的数据处理能力和算法设计能力。该问题的核心在于如何通过 AI 提供的坐标信息对多个指示灯进行合理的排序[^1]。 具体来说,问题要求按照以下规则实现排序: 1. **基准灯的选择**:从未排序的灯中选取最靠上的灯作为基准灯。 2. **同行判断**:如果两盏灯的高度差小于等于灯半径,则认为它们处于同一行。 3. **同行内的排序**:对于与基准灯位于同一行的所有灯,按照其 `x1` 坐标从小到大排列。 4. **重复操作**:直到所有灯都被排序完成为止。 以下是具体的解决方案及其代码实现: --- #### 解决方案 ##### 数据结构定义 为了便于管理每个灯的信息,可以定义一个类来封装灯的属性(编号、坐标范围等),并通过方法简化同行判断和比较逻辑。 ```python class Light: def __init__(self, no, x1, y1, x2, y2): self.no = no # 灯的编号 self.x1 = x1 # 左上角横坐标 self.y1 = y1 # 左上角纵坐标 self.x2 = x2 # 右下角横坐标 self.y2 = y2 # 右下角纵坐标 @property def height(self): # 计算灯的高度 return abs(self.y2 - self.y1) @property def radius(self): # 计算灯的半径 return self.height / 2 def is_in_same_row(self, other_light): # 判断是否在同一行 return abs(self.y1 - other_light.y1) <= self.radius and \ abs(self.y1 - other_light.y1) <= other_light.radius ``` --- ##### 主要逻辑流程 根据题目描述,整个排序过程可以通过以下几个步骤实现: 1. 初始化灯列表并验证输入的有效性。 2. 使用布尔数组记录哪些灯已经被选入最终结果。 3. 循环遍历未被选择的灯,从中选出当前最高(即最小 `y1`)的灯作为基准灯。 4. 找出与基准灯同属一行的所有灯,并将其按 `x1` 进行升序排序。 5. 将这些灯依次加入结果列表,并标记为已选择。 6. 当所有灯均被选择后结束循环,输出结果。 下面是完整的 Python 实现代码: ```python def sort_lights(n, lights_info): # 创建灯对象列表 lights = [] for info in lights_info: no, x1, y1, x2, y2 = map(int, info.split()) lights.append(Light(no, x1, y1, x2, y2)) # 初始化辅助变量 selected = [False] * n result = [] while True: # 寻找尚未选择的最高灯 min_y_index = None min_y_value = float('inf') for i in range(len(lights)): if not selected[i] and lights[i].y1 < min_y_value: min_y_index = i min_y_value = lights[i].y1 if min_y_index is None: # 如果没有剩余未选择的灯则退出 break base_light = lights[min_y_index] same_row_lights = [] # 存储与基准灯同行的灯 for j in range(len(lights)): if not selected[j] and base_light.is_in_same_row(lights[j]): same_row_lights.append((lights[j], lights[j].x1)) # 对同行灯按 x1 排序 same_row_lights.sort(key=lambda x: x[1]) for light_tuple in same_row_lights: result.append(light_tuple[0].no) selected[lights.index(light_tuple[0])] = True return result # 输入样例测 if __name__ == "__main__": input_data = [ "1 1 2 3 4", "2 5 7 8 9", "3 2 1 4 3", "4 6 6 9 8", "5 3 5 5 7" ] output = sort_lights(5, input_data) print(output) # 输出排序后的灯编号序列 ``` --- #### 复杂度分析 - 时间复杂度:假设总共有 \(N\) 盏灯,在每次迭代中都需要扫描一次灯列表以寻找基准灯,同时还需要筛选出行内灯并对其进行排序。因此时间复杂度大致为 \(O(N^2)\),其中排序部分的时间开销较小。 - 空间复杂度:额外的空间主要用于存储灯的对象实例以及一些临时变量,整体空间需求为 \(O(N)\)[^2]。 --- #### 注意事项 1. 输入校验非常重要,需确保满足约束条件(如灯的数量范围、坐标合法性等)。 2. 同行判定依赖于灯的几何特性(高度/半径),应严格遵循给定公式计算偏差阈值[^3]。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值