(注意:答案僅作為參考,但不作為最優解;實際機試中下面代碼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;
}
}
文章小尾巴
文章寫作、模闆、文章小尾巴可參考:《寫作“小心思”》
感謝你看到最後,最後再說兩點~
①如果你持有不同的看法,歡迎你在文章下方進行留言、評論。
②如果對你有幫助,或者你認可的話,歡迎給個小點贊,支援一下~
我是南方者,一個熱愛計算機更熱愛祖國的南方人。
(文章内容僅供學習參考,如有侵權,非常抱歉,請立即聯系作者删除。)