(注意:答案仅作为参考,但不作为最优解;实际机试中下面代码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;
}
}
文章小尾巴
文章写作、模板、文章小尾巴可参考:《写作“小心思”》
感谢你看到最后,最后再说两点~
①如果你持有不同的看法,欢迎你在文章下方进行留言、评论。
②如果对你有帮助,或者你认可的话,欢迎给个小点赞,支持一下~
我是南方者,一个热爱计算机更热爱祖国的南方人。
(文章内容仅供学习参考,如有侵权,非常抱歉,请立即联系作者删除。)