【华为OD-E卷 - 109 磁盘容量排序 100分(python、java、c++、js、c)】
【华为OD-E卷 - 磁盘容量排序 100分(python、java、c++、js、c)】
题目
磁盘的容量单位常用的有M,G,T这三个等级,
它们之间的换算关系为1T = 1024G,1G = 1024M,
现在给定n块磁盘的容量,请对它们按从小到大的顺序进行稳定排序,
例如给定5块盘的容量,1T,20M,3G,10G6T,3M12G9M
排序后的结果为20M,3G,3M12G9M,1T,10G6T。
注意单位可以重复出现,上述3M12G9M表示的容量即为3M+12G+9M,和12M12G相等
输入描述
- 输入第一行包含一个整数n(2 <= n <= 100),表示磁盘的个数,
接下的n行,每行一个字符串(长度大于2,小于30),
表示磁盘的容量,由一个或多个格式为mv的子串组成,
其中m表示容量大小,v表示容量单位,例如20M,1T,30G,10G6T,3M12G9M。
磁盘容量m的范围为1到1024的正整数,
容量单位v的范围只包含题目中提到的M,G,T三种,换算关系如题目描述
输出描述
- 输出n行,表示n块磁盘容量排序后的结果
用例
用例一:
输入:
3
1G
2G
1024M
输出:
1G
1024M
2G
用例二:
输入:
3
2G4M
3M2G
1T
输出:
3M2G
2G4M
1T
python解法
- 解题思路:
- 本程序的目标是对存储容量进行排序,输入的存储容量包含 M(MB),G(GB),T(TB) 等单位,排序时需按照实际大小进行比较。
解题步骤
读取输入
n:表示存储设备的数量。
disks:存储容量列表(例如 [“512M”, “2G”, “1T”])。
计算存储单位的实际数值 calculate_value(cap)
遍历字符串 cap 提取数值部分 num_str 和单位部分 M/G/T:
M (MB):保持数值不变。
G (GB):转换为 MB,1G = 1024M。
T (TB):转换为 MB,1T = 1024 × 1024M。
返回统一转换后的 MB 值,作为排序依据。
对 disks 进行排序
使用 sort(),按 calculate_value() 计算的数值排序。
输出排序后的存储容量
逐行打印排序后的 disks
# 读取存储设备数量
n = int(input())# 读取存储容量列表
disks = [input() for _ in range(n)]# 计算存储容量的数值(统一换算为 MB)
def calculate_value(cap):value = 0 # 存储最终的 MB 数值num_str = '' # 临时存储数值部分# 遍历字符串,提取数值和单位for ch in cap:if ch.isdigit():num_str += ch # 累积数值部分else:if ch == 'M': # MB 直接加value += int(num_str)elif ch == 'G': # GB 转换为 MB (1G = 1024M)value += int(num_str) * 1024elif ch == 'T': # TB 转换为 MB (1T = 1024 * 1024M)value += int(num_str) * 1024 * 1024num_str = '' # 重置数值存储return value # 返回统一换算的 MB 值# 按照转换后的数值进行排序
disks.sort(key=calculate_value)# 输出排序后的存储容量
for disk in disks:print(disk)
java解法
- 解题思路
- 本程序的目标是对存储容量进行排序,输入的存储容量包含 M(MB),G(GB),T(TB) 等单位,排序时需按照实际大小进行比较。
解题步骤
读取输入
读取整数 n,表示存储设备的数量。
读取 n 行存储容量信息,并存入 List disks。
计算存储单位的实际数值 computeValue(String capacity)
遍历 capacity 字符串,提取数值部分 number 和单位部分 M/G/T:
M (MB):保持数值不变,乘 1。
G (GB):转换为 MB,1G = 1024M。
T (TB):转换为 MB,1T = 1024 × 1024M。
计算统一转换后的 MB 值,并返回。
对 disks 进行排序
使用 sort() 方法,自定义 Comparator 进行排序,比较 computeValue(a) 和 computeValue(b)。
输出排序后的存储容量
遍历 disks,逐行打印排序后的结果
import java.util.*;public class Main {// 计算存储容量的数值(统一换算为 MB)private static long computeValue(String capacity) {long total = 0; // 存储最终的 MB 数值int multiplier = 0; // 存储当前单位的换算值StringBuilder number = new StringBuilder(); // 存储数值部分// 遍历存储容量字符串,解析数值和单位for (char c : capacity.toCharArray()) {if (Character.isDigit(c)) {number.append(c); // 累积数值部分} else {int num = Integer.parseInt(number.toString()); // 转换数值switch (c) {case 'M': multiplier = 1; break; // MB 直接使用case 'G': multiplier = 1024; break; // GB 转换为 MB (1G = 1024M)case 'T': multiplier = 1024 * 1024; break; // TB 转换为 MB (1T = 1024 * 1024M)}total += num * multiplier; // 计算总值number.setLength(0); // 清空 number,准备解析下一个数值}}return total; // 返回最终的 MB 数值}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // 读取存储设备数量sc.nextLine(); // 读取换行符,防止干扰输入List<String> disks = new ArrayList<>();for (int i = 0; i < n; i++) {disks.add(sc.nextLine()); // 读取存储容量}// 按照转换后的数值进行排序disks.sort((a, b) -> Long.compare(computeValue(a), computeValue(b)));// 输出排序后的存储容量for (String disk : disks) {System.out.println(disk);}}
}
C++解法
- 解题思路
- 本程序的目标是对存储容量进行排序,输入的存储容量包含 M(MB),G(GB),T(TB) 等单位,排序时需按照实际大小进行比较。
解题步骤
读取输入
读取整数 n,表示存储设备的数量。
读取 n 行存储容量信息,并存入 vector capacitys。
计算存储单位的实际数值 calc(const string& cap)
遍历 cap 字符串,提取数值部分 num 和单位部分 M/G/T:
M (MB):保持数值不变,乘 1。
G (GB):转换为 MB,1G = 1024M。
T (TB):转换为 MB,1T = 1024 × 1024M。
计算统一转换后的 MB 值,并返回。
对 capacitys 进行排序
使用 sort() 方法,调用 compare() 进行排序,比较 calc(a) 和 calc(b)。
输出排序后的存储容量
遍历 capacitys,逐行打印排序后的结果
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <sstream>using namespace std;// 数字转换函数,替代 C++11 的 stoi
int stringToInt(const string &s) {stringstream ss(s);int num;ss >> num;return num;
}// 计算存储容量的数值(统一换算为 MB)
int calc(const string& cap) {int ans = 0; // 存储最终的 MB 数值string num; // 临时存储数值部分// 遍历存储容量字符串,解析数值和单位for (size_t i = 0; i < cap.size(); ++i) {char c = cap[i];if (isdigit(c)) {num += c; // 累积数值部分} else {if (c == 'M') {ans += stringToInt(num); // MB 直接使用} else if (c == 'G') {ans += stringToInt(num) * 1024; // GB 转换为 MB (1G = 1024M)} else if (c == 'T') {ans += stringToInt(num) * 1024 * 1024; // TB 转换为 MB (1T = 1024 * 1024M)}num.clear(); // 清空 num,准备解析下一个数值}}return ans; // 返回最终的 MB 数值
}// 比较函数,按照存储容量大小排序
bool compare(const string &a, const string &b) {return calc(a) < calc(b);
}// 执行排序并输出结果
void getResult(vector<string> &capacitys) {sort(capacitys.begin(), capacitys.end(), compare); // 按照容量大小排序// 逐行输出排序后的存储容量for (size_t i = 0; i < capacitys.size(); ++i) {cout << capacitys[i] << endl;}
}int main() {int n;cin >> n; // 读取存储设备数量vector<string> capacitys(n);// 读取存储容量for (int i = 0; i < n; ++i) {cin >> capacitys[i];}// 进行排序并输出结果getResult(capacitys);return 0;
}
C解法
更新中
JS解法
解题步骤
读取输入
监听标准输入,每次读取一行并存入 lines 数组。
第一行输入 n,表示存储设备的数量。
读取 n 行存储容量信息,并存入 lines。
当 lines.length === n + 1 时,调用 processDisks(lines) 进行处理。
计算存储单位的实际数值 getCapacity(disk)
使用正则表达式 (\d+)([MGT]) 解析存储容量,提取数值和单位:
M (MB):保持数值不变。
G (GB):转换为 MB,1G = 1024M。
T (TB):转换为 MB,1T = 1024 × 1024M。
计算统一转换后的 MB 值,并返回。
对 disks 进行排序
使用 sort() 方法,按照 getCapacity() 计算的数值排序。
输出排序后的存储容量
遍历 disks,逐行打印排序后的结果
const readline = require("readline");const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});const lines = [];// 监听输入,每次读取一行
rl.on("line", (line) => {lines.push(line);// 判断是否读取完所有输入行(第一行为 n,后续 n 行为存储容量)if (lines.length === parseInt(lines[0], 10) + 1) {lines.shift(); // 移除第一行(n),保留存储容量数据processDisks(lines); // 调用处理函数lines.length = 0; // 清空 lines,准备下一次输入}
});// 处理并排序存储容量
function processDisks(disks) {disks.sort((a, b) => getCapacity(a) - getCapacity(b)) // 按存储容量大小排序.forEach((disk) => console.log(disk)); // 输出排序后的存储容量
}// 计算存储容量的数值(统一换算为 MB)
function getCapacity(disk) {let regex = /(\d+)([MGT])/g; // 正则匹配数值+单位(M、G、T)let result;let total = 0;// 解析存储容量字符串while ((result = regex.exec(disk)) !== null) {let num = parseInt(result[1], 10); // 提取数值部分let unit = result[2]; // 提取单位部分// 根据单位转换为 MBswitch (unit) {case "M":total += num; // MB 直接加break;case "G":total += num * 1024; // GB 转换为 MB (1G = 1024M)break;case "T":total += num * 1024 * 1024; // TB 转换为 MB (1T = 1024 * 1024M)break;}}return total; // 返回最终计算出的 MB 值
}
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
相关文章:
【华为OD-E卷 - 109 磁盘容量排序 100分(python、java、c++、js、c)】
【华为OD-E卷 - 磁盘容量排序 100分(python、java、c、js、c)】 题目 磁盘的容量单位常用的有M,G,T这三个等级, 它们之间的换算关系为1T 1024G,1G 1024M, 现在给定n块磁盘的容量,…...
【大数据技术】编写Python代码实现词频统计(python+hadoop+mapreduce+yarn)
编写Python代码实现词频统计(python+hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 本机PyCharm连接CentOS虚拟机 在阅读本文前,请确保已经阅读过以上三篇文章,成功搭建了…...
5-Scene层级关系
Fiber里有个scene是只读属性,能从fiber中获取它属于哪个场景,scene实体中又声明了fiber,fiber与scene是互相引用的关系。 scene层级关系 举例 在unity.core中的EntityHelper中,可以通过entity获取对应的scene root fiber等属性…...
JVM执行流程与架构(对应不同版本JDK)
直接上图(对应JDK8以及以后的HotSpot) 这里主要区分说明一下 方法区于 字符串常量池 的位置更迭: 方法区 JDK7 以及之前的版本将方法区存放在堆区域中的 永久代空间,堆的大小由虚拟机参数来控制。 JDK8 以及之后的版本将方法…...
本地部署 DeepSeek-R1:简单易上手,AI 随时可用!
🎯 先看看本地部署的运行效果 为了测试本地部署的 DeepSeek-R1 是否真的够强,我们随便问了一道经典的“鸡兔同笼”问题,考察它的推理能力。 📌 问题示例: 笼子里有鸡和兔,总共有 35 只头,94 只…...
请求响应(接上篇)
请求 日期参数 需要在前面加上一个注解DateTimeFormat来接收传入的参数的值 Json参数 JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用 RequestBody 标识 通过RequestBody将JSON格式的数据封装到实体类…...
数组排序算法
数组排序算法 用C语言实现的数组排序算法。 排序算法平均时间复杂度最坏时间复杂度最好时间复杂度空间复杂度是否稳定适用场景QuickO(n log n)O(n)O(n log n)O(log n)不稳定大规模数据,通用排序BubbleO(n)O(n)O(n)O(1)稳定小规模数据,教学用途InsertO(n)…...
防火墙的安全策略
1.VLAN 2属于办公区;VLAN 3属于生产区,创建时间段 [FW]ip address-set BG type object [FW-object-address-set-BG]address 192.168.1.0 mask 25 [FW]ip address-set SC type object [FW-object-address-set-SC]address 192.168.1.129 mask 25 [FW]ip address-se…...
2025Java面试题超详细整理《微服务篇》
什么是微服务架构? 微服务框架是将某个应用程序开发划分为许多独立小型服务,实现敏捷开发和部署,这些服务一般围绕业务规则进行构建,可以用不同的语言开发,使用不同的数据存储,最终使得每个服务运行在自己…...
中位数定理:小试牛刀> _ <2025牛客寒假1
给定数轴上的n个点,找出一个到它们的距离之和尽量小的点(即使我们可以选择不是这些点里的点,我们还是选择中位数的那个点最优) 结论:这些点的中位数就是目标点。可以自己枚举推导(很好想) (对于 点的数量为…...
(2025,LLM,下一 token 预测,扩散微调,L2D,推理增强,可扩展计算)从大语言模型到扩散微调
Large Language Models to Diffusion Finetuning 目录 1. 概述 2. 研究背景 3. 方法 3.1 用于 LM 微调的高斯扩散 3.2 架构 4. 主要实验结果 5. 结论 1. 概述 本文提出了一种新的微调方法——LM to Diffusion (L2D),旨在赋予预训练的大语言模型(…...
如何开发一个大语言模型,开发流程及需要的专业知识
开发大型语言模型(LLM)是一个复杂且资源密集的过程,涉及多个阶段和跨学科知识。以下是详细的开发流程和所需专业知识指南: 一、开发流程 1. 需求分析与规划 目标定义:明确模型用途(如对话、翻译、代码生成…...
【数据采集】基于Selenium采集豆瓣电影Top250的详细数据
基于Selenium采集豆瓣电影Top250的详细数据 Selenium官网:https://www.selenium.dev/blog/ 豆瓣电影Top250官网:https://movie.douban.com/top250 写在前面 实验目标:基于Selenium框架采集豆瓣电影Top250的详细数据。 电脑系统:Windows 使用软件:PyCharm、Navicat 技术需求…...
neo4j-在Linux中安装neo4j
目录 切换jdk 安装neo4j 配置neo4j以便其他电脑可以访问 切换jdk 因为我安装的jdk是1.8版本的,而我安装的neo4j版本为5.15,Neo4j Community 5.15.0 不支持 Java 1.8,它要求 Java 17 或更高版本。 所以我需要升级Java到17 安装 OpenJDK 17 sudo yu…...
多无人机--强化学习
这个是我对于我的大创项目的构思,随着时间逐渐更新 项目概要 我们的项目平台来自挑战杯揭绑挂帅的无人机对抗项目,但是在由于时间原因,并未考虑强化学习,所以现在通过大创项目来弥补遗憾 我们项目分为三部分,分为虚…...
UE制作2d游戏
2d免费资产: Free 2D Game Assets - CraftPix.net 需要用到PaperZD插件 官网下载后启用即可 导入png素材 然后全选 - 创建Sprite 创建 人物基类 设置弹簧臂和相机 弹簧臂设置成旋转-90 , 取消碰撞测试 设置子类Sprite 拖到场景中 绑定设置输入映射,让角色移动跳跃 神似卡拉比…...
说一下JVM管理的常见参数
Java虚拟机(JVM)有许多常见参数,用于控制其行为和性能。以下是一些常见的JVM参数及其说明: 1. 内存管理参数 -Xms<size> START 设置初始堆内存大小。例如,-Xms512m表示初始堆大小为512MB。 -Xmx<size>…...
【FPGA】 MIPS 12条整数指令【2】
目录 仿真 代码 完整代码 实现slt 仿真 ori r1,r0,1100h ori r2,r0,0020h ori r3,r0,ff00h ori r4,r0,ffffh addi r5,r0,ffff slt r6,r5,r4 slt r6,r4,r3 代码 EX Slt:regcData ($signed(regaData)<$signed(regbData))?1b1:1b0; ID Inst_slt:be…...
机器学习--python基础库之Matplotlib (2) 简单易懂!!!
python基础库之Matplotlib(2) python基础库之Matplotlib0 准备1 散点图的绘制2 柱状图绘制3 其他 python基础库之Matplotlib 上篇文章机器学习–python基础库之Matplotlib (1) 超级详细!!!主要讲解了python的基础库matplotlib中绘图的流程以及折线图的…...
mybatis plus 持久化使用技巧及场景
mybatis plus提供了很多强大的持久化工具,新手容易对这些工具使用困难,下面我总结了一下mybatis plus持久化的使用技巧及使用场景。 一、持久化 官方文档:https://baomidou.com/guides/data-interface/ (一)通过ser…...
TOAST UI Chart错误处理与调试终极指南:10个常见问题解决方案大全
TOAST UI Chart错误处理与调试终极指南:10个常见问题解决方案大全 【免费下载链接】tui.chart 🍞📊 Beautiful chart for data visualization. 项目地址: https://gitcode.com/gh_mirrors/tu/tui.chart TOAST UI Chart是一款功能强大的…...
IntelliJ IDEA 彻底AI化!2026.1 版重磅发布,太香了
备受期待的 IntelliJ IDEA 2026.1 版本现已正式发布!本次更新带来了多项重磅功能,从 AI 智能体深度集成到主流语言框架的一流支持,全方位提升开发效率。无论您是 Java、Kotlin 开发者,还是涉及 C/C、TypeScript 的多语言项目开发者…...
45V耐压CSM7345SG ESOP8,可调12V输出+使能端+散热片,低压差线性稳压器
CSM7345 ESOP8可调12V输出带使能端 全方案深度分析我会从芯片核心特性、12V输出原理、使能端设计、电路参数计算、保护机制、PCB设计要点等维度,做完整的工程级拆解,帮你彻底吃透这个方案。一、芯片核心特性(适配12V输出的关键参数࿰…...
MAP vs MLE:机器学习参数估计该怎么选?5个真实案例告诉你答案
MAP vs MLE:机器学习参数估计该怎么选?5个真实案例告诉你答案 在机器学习项目的参数估计环节,数据科学家常常面临一个关键选择:采用最大后验概率(MAP)还是最大似然估计(MLE)…...
SeamlessM4T v2:构建跨语言沟通的无缝桥梁
SeamlessM4T v2:构建跨语言沟通的无缝桥梁 【免费下载链接】seamless-m4t-v2-large 项目地址: https://ai.gitcode.com/hf_mirrors/ai-gitcode/seamless-m4t-v2-large SeamlessM4T v2是Meta AI推出的新一代大规模多语言多模态机器翻译模型,能够在…...
11,2kw双向储能变换器:基于PFCLLC结构的工业应用仿真研究
11,2kw双向储能变换器仿真,已工业应用。 pfcllc结构,可整流,可逆变。 整流模式下,pfc为单相pwm整流器,输入电压220V,50Hz,llc输出电压55V。 逆变模式下,llc输入电压55V&a…...
拒绝“一眼AI”!硬核跑通Gemini去AIGC工作流:实测3组调优指令+3款工具,把99%硬生生打回10%
视角重构,打破“平铺直叙”的机械感 AI生成的最大特征是“正确但平庸的上帝视角”。要ai降ai,第一步不是改词,而是强行植入一个具有批判性的“人类观察者”视角,迫使模型重组叙事逻辑。 核心原理:通过引入“辩证法”…...
OpenClaw性能调优:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF长文本处理技巧
OpenClaw性能调优:Qwen3-4B-Thinking-2507-GPT-5-Codex-Distill-GGUF长文本处理技巧 1. 为什么需要长文本优化 上周我尝试用OpenClaw处理一份200页的技术文档摘要任务时,遭遇了典型的"长文本困境"——模型要么漏掉关键段落,要么生…...
用STM32和GP2Y1014AU0F做个空气质量检测仪(附完整代码和接线图)
基于STM32的空气质量检测仪实战开发指南 最近几年,随着人们对健康生活环境的关注度不断提升,空气质量监测设备正从专业领域走向大众消费市场。作为一名嵌入式开发爱好者,我发现市面上的商用检测仪要么价格昂贵,要么功能单一&#…...
告别单点故障:Azkaban 3.84.4多Executor集群部署与性能调优实战
告别单点故障:Azkaban 3.84.4多Executor集群部署与性能调优实战 在数据密集型企业的日常运营中,任务调度系统如同中枢神经般重要。当团队规模扩大、数据处理需求激增时,单节点Azkaban往往会成为性能瓶颈——任务队列堆积、响应延迟࿰…...
