2025 A卷 100分 題型
本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析;
并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式!
2025華為OD真題目錄+全流程解析/備考攻略/經驗分享
華為OD機試真題《文件目錄大小》:
目錄
- 題目名稱:文件目錄大小
- 題目描述
- 示例
- Java
- 問題分析
- 解決思路
- 代碼實現
- 代碼詳細解析
- 綜合分析
- python
- 題目分析
- 解決思路
- Python 代碼實現
- 代碼逐行注釋
- 綜合分析
- 示例測試
- 輸入1:
- 輸入2:
- 總結
- JavaScript
- 題目分析
- 解決思路
- JavaScript 代碼實現
- 代碼逐行注釋
- 綜合分析
- 示例測試
- 輸入1:
- 輸入2:
- 總結
- C++
- 題目分析
- 解決思路
- C++ 代碼實現
- 代碼逐行解析
- 綜合分析
- 示例測試
- 輸入1:
- 輸入2:
- 總結
- C語言
- 題目分析
- 解決思路
- C 代碼實現
- 代碼逐行解析
- 綜合分析
- 示例測試
- 輸入1:
- 輸入2:
- 總結
- GO
- 題目分析
- 解決思路
- Go 代碼實現
- 代碼逐行注釋
- 綜合分析
- 示例測試
- 輸入1:
- 輸入2:
- 總結
題目名稱:文件目錄大小
知識點:字符串、棧操作(DFS)、邏輯處理
時間限制:1秒
空間限制:256MB
限定語言:不限
題目描述
一個文件目錄的數據格式為:目錄id,本目錄中文件大小,(子目錄id列表)。其中:
- 目錄id全局唯一,取值范圍為[1, 200]
- 本目錄文件大小范圍為[1, 1000]
- 子目錄id列表個數為[0, 10]
輸入描述
- 第一行:兩個整數
M
和N
,表示目錄個數和待查詢的目錄id(1 ≤ M ≤ 100
,1 ≤ N ≤ 200
)。 - 后續
M
行:每行描述一個目錄,格式為目錄id 文件大小 (子目錄列表)
,例如1 20 (2,3)
。
輸出描述
- 待查詢目錄及其所有子目錄的文件大小之和。
示例
輸入1
3 1
3 15 ()
1 20 (2)
2 10 (3)
輸出1
45
輸入2
4 2
4 20 ()
5 30 ()
2 10 (4,5)
1 40 ()
輸出2
60
Java
問題分析
這道題目要求計算指定目錄及其所有子目錄的文件大小總和。我們可以將其視為一個樹形結構問題,每個目錄作為節點,子目錄作為子節點。以下是詳細的解決思路和代碼實現。
解決思路
- 輸入解析:首先讀取目錄數目M和目標目錄N,然后逐行解析每個目錄的信息,包括目錄ID、文件大小和子目錄列表。
- 數據結構:使用兩個哈希表分別存儲目錄的大小和子目錄列表,便于快速查找。
- 遞歸計算:從目標目錄開始,遞歸遍歷所有子目錄,累加文件大小總和。
代碼實現
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 讀取目錄個數M和待查詢的目錄id Nint M = scanner.nextInt();int N = scanner.nextInt();scanner.nextLine(); // 跳過剩余換行符// 使用哈希表存儲目錄的大小和子目錄列表Map<Integer, Integer> sizeMap = new HashMap<>();Map<Integer, List<Integer>> childrenMap = new HashMap<>();for (int i = 0; i < M; i++) {String line = scanner.nextLine().trim();// 使用正則表達式按一個或多個空格分割行數據String[] parts = line.split("\\s+");int dirId = Integer.parseInt(parts[0]);int size = Integer.parseInt(parts[1]);String childrenStr = parts[2]; // 子目錄列表部分,如"(2,3)"// 處理子目錄字符串,提取子目錄idchildrenStr = childrenStr.substring(1, childrenStr.length() - 1) // 去掉括號.trim(); // 去除可能存在的首尾空格List<Integer> children = new ArrayList<>();if (!childrenStr.isEmpty()) { // 處理非空子目錄列表String[] childIds = childrenStr.split(",");for (String childId : childIds) {childId = childId.trim(); // 去除每個子目錄id的前后空格if (!childId.isEmpty()) {children.add(Integer.parseInt(childId));}}}// 將解析后的數據存入哈希表sizeMap.put(dirId, size);childrenMap.put(dirId, children);}// 計算目標目錄及其所有子目錄的總大小int totalSize = calculateTotalSize(N, sizeMap, childrenMap);System.out.println(totalSize);}// 遞歸計算目錄總大小private static int calculateTotalSize(int dirId, Map<Integer, Integer> sizeMap, Map<Integer, List<Integer>> childrenMap) {// 獲取當前目錄的大小int sum = sizeMap.get(dirId);// 遍歷所有子目錄,遞歸累加for (int childId : childrenMap.get(dirId)) {sum += calculateTotalSize(childId, sizeMap, childrenMap);}return sum;}
}
代碼詳細解析
-
輸入處理:
- 使用
Scanner
讀取輸入,第一行讀取M和N。 scanner.nextLine()
用于跳過換行符,確保后續讀取正確。
- 使用
-
數據結構初始化:
sizeMap
存儲目錄ID到文件大小的映射。childrenMap
存儲目錄ID到子目錄列表的映射。
-
解析目錄信息:
- 每行按空格分割為三部分:目錄ID、文件大小、子目錄列表字符串。
- 處理子目錄字符串:去除括號和空格,分割后轉為整數列表。
-
遞歸計算總大小:
- 遞歸函數
calculateTotalSize
從目標目錄開始,累加當前目錄大小及其所有子目錄的總大小。
- 遞歸函數
綜合分析
- 高效的數據結構:哈希表提供O(1)時間復雜度的查找,適合快速訪問目錄信息。
- 遞歸的簡潔性:遞歸自然契合樹形結構,代碼簡潔易懂,適合處理嵌套子目錄。
- 健壯性:正確處理輸入中的各種格式(如空格、空子目錄列表),確保解析準確。
- 時間復雜度:每個目錄僅訪問一次,總時間復雜度為O(M),滿足題目限制。
通過這種方法,能清晰理解目錄結構的遍歷和遞歸計算過程,確保正確高效地解決問題。
python
題目分析
題目要求計算指定目錄及其所有子目錄的文件大小總和。每個目錄信息以 目錄id 文件大小 (子目錄列表)
的格式給出,我們需要從輸入中解析這些信息,并遞歸地累加目標目錄及其所有子目錄的文件大小。
解決思路
- 輸入解析:讀取目錄數量
M
和目標目錄N
,解析每個目錄的信息。 - 數據結構:用字典存儲目錄的文件大小和子目錄列表。
- 遞歸計算:從目標目錄開始,遞歸遍歷所有子目錄,累加文件大小總和。
Python 代碼實現
def main():import sys# 讀取輸入lines = [line.strip() for line in sys.stdin if line.strip()]# 解析 M 和 NM, N = map(int, lines[<