【华为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…...
百度网盘直链解析工具:3分钟突破限速实现满速下载
百度网盘直链解析工具:3分钟突破限速实现满速下载 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾为百度网盘的下载速度而烦恼?非会员用户经常…...
δ - mem:提升大型语言模型内存效率,得分最高可达 1.31 倍!
快速通道可了解 arXiv 成为独立非营利组织的情况,也能直达康奈尔大学官网。同时,还能通过链接进行捐赠,支持 arXiv 的发展。搜索与导航提供了多种搜索途径,可在所有字段(标题、作者、摘要等)进行搜索。还有…...
iOS越狱终极指南:解锁iPhone隐藏功能的3个关键步骤
iOS越狱终极指南:解锁iPhone隐藏功能的3个关键步骤 【免费下载链接】Jailbreak iOS 26.4 - 26, 17 - 17.7.5 & iOS 18 - 18.7.3 Jailbreak Tools, Cydia/Sileo/Zebra Tweaks & Jailbreak News Updates || AI Jailbreak Finder 👇 项目地址: ht…...
多智能体的协作成本:沟通开销、上下文膨胀与优化手段
多智能体的协作成本:沟通开销、上下文膨胀与优化手段 1. 标题 (Title) 多智能体系统的协作困境:解析沟通开销与上下文膨胀 从理论到实践:优化多智能体协作成本的完整指南 协作的代价:多智能体系统中的沟通、上下文与优化策略 打破协作壁垒:如何有效降低多智能体系统的运行…...
UEFITool终极指南:轻松解析和编辑UEFI固件的开源利器
UEFITool终极指南:轻松解析和编辑UEFI固件的开源利器 【免费下载链接】UEFITool UEFI firmware image viewer and editor 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITool 你是否曾好奇计算机启动时底层发生了什么?想要深入了解UEFI固件的…...
窗口大小控制神器:3分钟掌握WindowResizer的终极窗口调整技巧
窗口大小控制神器:3分钟掌握WindowResizer的终极窗口调整技巧 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 还在为那些顽固的应用程序窗口而束手无策吗?是…...
防火墙和手动启动都试了?ArcGIS License Server无响应,可能是这两个核心文件在捣鬼
ArcGIS许可服务故障深度解析:当核心文件成为隐形杀手 当你面对ArcGIS License Server无响应的红色报错框,已经尝试了关闭防火墙、调整服务配置、甚至重启服务器等一系列标准操作后,那个令人沮丧的"cannot connect to license server sys…...
GitHub自动化运维:构建模块化Operator集提升开发效率
1. 项目概述:一个为GitHub开发者量身定制的“操作集”如果你是一个重度GitHub用户,无论是维护个人项目、参与开源贡献,还是管理团队仓库,大概率都经历过这样的场景:每天要重复执行一堆琐碎但必要的操作。比如ÿ…...
基于CircuitPython的嵌入式游戏开发:从帧缓冲区到对象池的Flappy Bird实现
1. 项目概述:当Flappy Bird遇上CircuitPython如果你玩过经典的Flappy Bird,也捣鼓过像Raspberry Pi Pico这样的微控制器,那你有没有想过把这两者结合起来?我最近就用CircuitPython在RP2040开发板上完整复刻了一个“猫版”Flappy B…...
如何加入GEO从入门到精通知识星球?
很多人学了GEO理论,却不知道怎么落地——因为GEO不是靠手动摸索能高效完成的,它需要工具支撑每一个环节。GEO优化分三个核心环节,每个环节都有对应的工具。第一环节:问题挖掘用什么工具:GEO之家问题大师传统SEO靠关键词…...
