華為OD機試 2024C卷題庫瘋狂收錄中,刷題點這里
專欄導讀
本專欄收錄于《華為OD機試(JAVA)真題(A卷+B卷+C卷)》。
刷的越多,抽中的概率越大,每一題都有詳細的答題思路、詳細的代碼注釋、樣例測試,發現新題目,隨時更新,全天CSDN在線答疑。
一、題目描述
有N塊二手市場收集的銀飾,每塊銀飾的重量都是正整數,收集到的銀飾會被熔化用于打造新的飾品。
每一回合,從中選出三塊 最重的 銀飾,然后一起熔掉。
假設銀飾的重量分別為 x 、y和z,且 x <= y <= z。那么熔掉的可能結果如下:
- 如果 x == y == z,那么三塊銀飾都會被完全熔掉;
- 如果 x == y 且 y != z,會剩余重量為 z - y 的銀塊無法被熔掉;
- 如果 x != y 且 y == z,會剩余重量為 y - x 的銀塊無法被熔掉;
- 如果 x != y 且 y != z,會剩余重量為 z - y 與 y - x 差值 的銀塊無法被熔掉。
- 最后,如果剩余兩塊,返回較大的重量(若兩塊重量相同,返回任意一塊皆可);
- 如果只剩下一塊,返回該塊的重量;如果沒有剩下,就返回 0。
二、輸入描述
輸入數據為兩行
第一行為銀飾數組長度 n,1 ≤ n ≤ 40,
第二行為n塊銀飾的重量,重量的取值范圍為[1,2000],重量之間使用空格隔開
三、輸出描述
如果剩余兩塊,返回較大的重量(若兩塊重量相同,返回任意一塊皆可);
如果只剩下一塊,返回該塊的重量;如果沒有剩下,就返回 0。
輸入:
3
1 1 1
輸出:
0
說明:
選出1 1 1,得到 0,最終數組轉換為 [],最后沒有剩下銀塊,返回0
四、解題思路
該問題要求處理一組銀飾的重量,通過特定的熔化規則不斷減少銀飾數量,直到剩余少于三塊銀飾。具體熔化規則根據最重的三塊銀飾的重量差異來決定是否生成新的剩余銀塊。解決這個問題的一個簡單方法是使用排序和模擬的方式。
這個問題的核心思路是:
- 對所有銀飾重量進行排序。
- 每次選擇最重的三塊銀飾,按規則進行熔化。
- 更新剩余銀飾的數組,如果有新的剩余銀塊產生,將其加入數組。
- 重復上述過程,直到剩余銀飾不足三塊。
- 根據最后剩余的銀飾數量,返回對應的結果。
五、Java算法源碼
public class OdTest01 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();List<Integer> weights = new ArrayList<>();for (int i = 0; i < n; i++) {weights.add(scanner.nextInt());}System.out.println(meltSilverware(weights));}private static int meltSilverware(List<Integer> weights) {// 當銀飾數少于3塊時,處理剩余情況while (weights.size() >= 3) {Collections.sort(weights, Collections.reverseOrder()); // 降序排序int z = weights.get(0);int y = weights.get(1);int x = weights.get(2);// 移除最重的三塊銀飾weights.remove(0);weights.remove(0);weights.remove(0);// 根據規則計算剩余銀飾if (x == y && y == z) {// 全部熔掉,不剩余} else if (x == y && y != z) {// 剩余 z - yweights.add(z - y);} else if (x != y && y == z) {// 剩余 y - xweights.add(y - x);} else if (x != y && y != z) {// 剩余 z - y 與 y - xint newWeight = Math.abs((z - y) - (y - x));if (newWeight > 0) {weights.add(newWeight);}}}// 處理剩余的銀飾情況if (weights.size() == 2) {return Math.max(weights.get(0), weights.get(1));} else if (weights.size() == 1) {return weights.get(0);} else {return 0;}}
}
六、效果展示
1、輸入
3
3 7 10
2、輸出
1
3、說明
選出 3 7 10,需要計算 (7-3) 和 (10-7) 的差值,即(7-3)-(10-7)=1,所以數組轉換為 [1],剩余一塊,返回該塊重量,返回1
🏆下一篇:華為OD機試 - 簡易內存池 - 邏輯分析(Java 2024 C卷 200分)
🏆本文收錄于,華為OD機試(JAVA)真題(A卷+B卷+C卷)
刷的越多,抽中的概率越大,每一題都有詳細的答題思路、詳細的代碼注釋、樣例測試,發現新題目,隨時更新,全天CSDN在線答疑。