天天看点

【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
           

例2:

输入:
5
4G2M
3M4G
2T
10G
2010M

输出:
2010M
4G2M
3M4G
10G
2T
           

解题思路

这道题由于需要有输入顺序,而且容量单位的顺序不分前后(如:

1G1M

1M1G

,是一样的容量值)。

  因此,决定先把所有值进行转化为最小单位 M 对应的值,再进行处理和排序。

二、整体逻辑与完整代码

整体逻辑

声明

Map<Integer, List<String>>

(key:化为单位 M 容量的数值;value:加入顺序)

声明

List<Integer>

记录化为单位 M 容量的数值(这里要去重)

写当前的容量换算为最小单位M对应的容量的方法(如:

2G1M = 1024*2 + 1 = 2049M

在遍历所有值进行转化为最小单位 M 对应的值时,

map

为空,创建

list<String>

;并把对应的

key

也塞到

List<Integer>

记录中。

最后,再对记录进行排序,遍历对应的值即可。(具体更为详细的可结合完整代码来看)

完整代码

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

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;
	}
}
           

文章小尾巴

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

  感谢你看到最后,最后再说两点~

  ①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。

  ②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~

  我是南方者,一个热爱计算机更热爱祖国的南方人。

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

继续阅读