华为OD机考算法题:磁盘容量排序

编程入门 行业动态 更新时间:2024-10-09 04:23:57

<a href=https://www.elefans.com/category/jswz/34/1769368.html style=华为OD机考算法题:磁盘容量排序"/>

华为OD机考算法题:磁盘容量排序

题目部分

题目磁盘容量排序
难度
题目说明磁盘的容量单位常用的有 M、G、T 三个等级,他们之间的换算关系为 1T =1024G,1G=1024M。 现在给定 n 块磁盘的容量,请对他们按从小到大的顺序进行稳定排序。
例如,给定 5 块盘的容量:
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。磁盘容量的范围为 1 到 1024 的正整数,单位 M、G、T。换算关系如题目所述。
输出描述输出 n 行,表示 n 块磁盘容量排序后的结果。
补充说明
------------------------------------------------------
示例
示例1
输入3
1G
2G
1024M
输出1G
1024M
2G
说明1G 和 1024M 容量相等,稳定排序要求他们保留原来的相对位置,故 1G 在 1024M 之前。
示例2
输入3
2G4M
3M2G
1T
输出3M2G
2G4M
1T
说明1T 的容量大于 2G4M,2G4M 的容量大于 2M2G。


解读与分析

题目解读:

输入一组的表示容量的字符串,将每个字符串转换成相同单位大小的数字,进行比较,然后按照从小到大的顺序排序(稳定排序),输出。

分析与思路:

此题的关键问题在于解析字符串,然后把解析后的字符串转换成统一的单位 M ,之后对数据进行排序。

解析字符串需要遍历 1 次,排序的时间复杂度为 O(nlogn),因此此算法的时间复杂度为 O(nlogn),空间复杂度为 O(n)。

此题的思路与《华为OD机考算法题:日志排序》完全一致。

更进一步,可以把“解析后的字符串转换成统一的单位 M ”这个操作放到初始解析之后,排序之前,以免在排序过程中,每两两比较时都要进行转换,实际上对性能有影响。


代码实现

Java代码

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;/*** 磁盘容量排序* * @since 2023.11.02* @version 0.1* @author Frank**/
public class DiskCapacity {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String input = sc.nextLine();int count = Integer.parseInt(input);String[] numArr = new String[count];for (int i = 0; i < count; i++) {input = sc.nextLine();numArr[i] = input;}processDiskCapacity(numArr);}}private static void processDiskCapacity(String[] numArr) {Comparator<String> comp = new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {int o1Capacity = parseCapacity(o1);int o2Capacity = parseCapacity(o2);return o1Capacity - o2Capacity;}};Arrays.sort(numArr, comp);for (int i = 0; i < numArr.length; i++) {System.out.println(numArr[i]);}}private static int parseCapacity(String input) {int ret = 0;int start = 0;int i = 0;while( i < input.length() ){char curChar =  input.charAt( i );while( curChar >= '0' && curChar <= '9' ){i ++;curChar =  input.charAt( i );}String intStr = input.substring( start, i );int curValue = Integer.parseInt( intStr );int times = 1;if( curChar == 'M' ){times = 1;}else if( curChar == 'G' ){times = 1024;}else if( curChar == 'T' ){times = 1024 * 1024;}curValue = curValue * times;ret += curValue;i ++;start = i;}return ret;}}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {while (line = await readline()) {var count = parseInt(line);var numArr = new Array();for (var i = 0; i < count; i++) {line = await readline();numArr[i] = line;}processDiskCapacity(numArr);}
}();function processDiskCapacity(numArr) {var comp = function(o1, o2) {var o1Capacity = parseCapacity(o1);var o2Capacity = parseCapacity(o2);return o1Capacity - o2Capacity;};numArr.sort(comp);for (var i = 0; i < numArr.length; i++) {console.log(numArr[i]);}
}function parseCapacity(input) {var ret = 0;var start = 0;var i = 0;while (i < input.length) {var curChar = input.charAt(i);while (curChar >= '0' && curChar <= '9') {i++;curChar = input.charAt(i);}var intStr = input.substring(start, i);var curValue = parseInt(intStr);var times = 1;if (curChar == 'M') {times = 1;} else if (curChar == 'G') {times = 1024;} else if (curChar == 'T') {times = 1024 * 1024;}curValue = curValue * times;ret += curValue;i++;start = i;}return ret;
}

(完)

更多推荐

华为OD机考算法题:磁盘容量排序

本文发布于:2023-11-30 14:04:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1651055.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:华为   磁盘   算法   容量   机考

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!