天天看點

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

文章小尾巴

文章寫作、模闆、文章小尾巴可參考:《寫作“小心思”》

  感謝你看到最後,最後再說兩點~

  ①如果你持有不同的看法,歡迎你在文章下方進行留言、評論。

  ②如果對你有幫助,或者你認可的話,歡迎給個小點贊,支援一下~

  我是南方者,一個熱愛計算機更熱愛祖國的南方人。

  (文章内容僅供學習參考,如有侵權,非常抱歉,請立即聯系作者删除。)

繼續閱讀