• 【2022华为od机试题】【JAVA】【刷题子】华为od机试题:磁盘容量排序(AC:100%)


    (注意:答案仅作为参考,但不作为最优解;实际机试中下面代码ac通过率:100%。如有更好优化的空间欢迎文章下方进行留言讨论)

    一、题目与题目分析

    题目

    磁盘的容量v是有M、G、T三个等级的单位。(其中1T=1024G,1G=1024M)
      第一行输入n,代表有n个容量值需要进行排序。
      再输入对应n行的容量值。
      最后输出从小到大排序好的容量值。
      (注:如果出现多个(两个或两个以上)容量值相同,需要按照输入顺序来输出。如1025M,1M1G,1G1M;这仨都一样的容量值,但1025M先输入,所以输出顺序为:1025M,1M1G,1G1M
      例1:

    输入:
    3
    1G
    2G
    1024M
    
    输出:
    1G
    1024M
    2G
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    例2:

    输入:
    5
    4G2M
    3M4G
    2T
    10G
    2010M
    
    输出:
    2010M
    4G2M
    3M4G
    10G
    2T
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    解题思路

    这道题由于需要有输入顺序,而且容量单位的顺序不分前后(如:1G1M1M1G,是一样的容量值)。
      因此,决定先把所有值进行转化为最小单位 M 对应的值,再进行处理和排序。

    二、整体逻辑与完整代码

    整体逻辑

    声明 Map>(key:化为单位 M 容量的数值;value:加入顺序)
    声明 List 记录化为单位 M 容量的数值(这里要去重)
    写当前的容量换算为最小单位M对应的容量的方法(如:2G1M = 1024*2 + 1 = 2049M
    在遍历所有值进行转化为最小单位 M 对应的值时,map为空,创建list;并把对应的 key 也塞到 List记录中。
    最后,再对记录进行排序,遍历对应的值即可。(具体更为详细的可结合完整代码来看)

    完整代码

    整体逻辑清晰了之后,同时也有较清楚的注释。直接来看代码吧! (如有不懂的或者更好的建议,欢迎评论区分享友友的看法哈~)

    package com.anpai.nanfangzhe.work;
    import java.util.*;
    
    public class Demo {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		sortMGT(sc);
    	}
            
    	// 1. 磁盘容量排序(AC:100%)
    	public static void sortMGT(Scanner sc) {
    		String n = sc.nextLine();
    		String[] strs = new String[Integer.valueOf(n)];
    		for (int i = 0; i < Integer.valueOf(n); i++) {
    			strs[i] = sc.nextLine();
    		}
    		// key:化为容量(单位:M);value:加入顺序
    		Map<Integer, List<String>> map = new HashMap<Integer, List<String>>();
    
    		// 记录化为对应最小单位M的容量下标
    		List<Integer> numList = new ArrayList<>();
    		for (String str : strs) {
    			// System.out.println(str);
    			Integer mSum = getMSum(str);
    			List<String> list = map.get(mSum);
    			if (list == null) {
    				// 为空创建新数组
    				list = new ArrayList<String>();
    				// 记录当前换算为最小单位的M
    				numList.add(mSum);
    			}
    			// list数组里添加对应的容量
    			list.add(str);
    			// 往map塞(key:最小单位对应的容量数值mSum;value:list)
    			map.put(mSum, list);
    		}
    		// 数组进行从小到大排序
    		numList.sort(null);
    		for (Integer num : numList) { // 遍历numList数组(从小到大)
    			List<String> list = map.get(num); // list已按照添加顺序记录,再遍历list输出即可
    			for (String str : list) {
    				System.out.println(str);
    			}
    			// System.out.println("mSum:" + num);
    		}
    
    	}
    
    	// 把当前的容量换算为最小单位M对应的容量(如:2G1M = 1024*2 + 1 = 2049M )
    	public static Integer getMSum(String str) {
    		// 遍历容量逐个字符,数字进行拼接添加记录,碰上单位就结算一次。最终转化为最小单位M对应的容量数值
    		int mSum = 0;
    		String numStr = "";
    		for (char ch : str.toCharArray()) {
    			if (ch == 'M') {
    				// 碰上'M'单位了,直接转换,并把 numStr重新置空
    				mSum += Integer.valueOf(numStr);
    				numStr = "";
    			} else if (ch == 'G') {
    				// 碰上'G'单位了,转换后再乘上 1024,并把 numStr重新置空
    				mSum += Integer.valueOf(numStr) * 1024;
    				numStr = "";
    			} else if (ch == 'T') {
    				// 碰上'T'单位了,转换后再乘上 1024 * 1024,并把 numStr重新置空
    				mSum += Integer.valueOf(numStr) * 1024 * 1024;
    				numStr = "";
    			} else {
    				// 是数字,numStr进行拼接添加
    				numStr += ch;
    			}
    		}
    		// 最小单位对应的容量数值
    		return mSum;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75

    文章小尾巴

    文章写作、模板、文章小尾巴可参考:《写作“小心思”》

      感谢你看到最后,最后再说两点~
      ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
      ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
      我是南方者,一个热爱计算机更热爱祖国的南方人。

      (文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)

  • 相关阅读:
    VScode:前端项目中yarn包的安装和使用
    vite是什么
    在滴滴和字节跳动干了 2 年测试开发,太真实…
    全排列:让我看到未来所有的可能 -> 跨越CV小白的回溯算法
    Java使用apache.poi生成excel插入word中
    恒运资本:减肥药概念涨疯了!特斯拉一夜暴涨5800亿市值,汽车股狂飙
    快速入门C++第五天——多态性和虚函数
    FITC荧光素标记角叉菜胶;Carrageenan-FITC ;FITC-Carrageenan
    京东数据接口:京东数据分析怎么做?
    pytorch之nn.Conv1d详解
  • 原文地址:https://blog.csdn.net/qq_43263647/article/details/126698591