2025 A卷 200分 題型
本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式;
并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析;
本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分享》
華為OD機試真題《洞穴探險》:
文章快捷目錄
題目描述及說明
Java
python
JavaScript
C
GO
題目名稱:洞穴探險
- 知識點:字符串處理、正則匹配(或棧操作)、邏輯判斷
- 時間限制:1秒
- 空間限制:256MB
- 限定語言:不限
題目描述
某探險隊負責對地下洞穴進行探險。探險隊成員在進行探險任務時,隨身攜帶的記錄器會不定期地記錄自身的坐標,但在記錄的間隙中也會記錄其他數據。探索工作結束后,探險隊需要獲取到某成員在探險過程中相對于探險隊總部的最遠足跡位置。
坐標規則
- 坐標格式為
(x,y)
,例如(1,2)
、(100,200)
,其中0 < x < 1000
,0 < y < 1000
。 - 非法坐標包括以下情況:
- 數字前導零(如
(01,1)
、(1,01)
); - 坐標值為0或超出范圍(如
(0,100)
)。
- 數字前導零(如
距離計算
- 總部坐標為
(0,0)
,某位置(x,y)
的相對距離為 ( x^2 + y^2 )。 - 若兩個坐標距離相同,則以第一次出現的坐標為準。
- 若所有坐標均非法,輸出
(0,0)
。
輸入描述
一行字符串,表示記錄儀中的數據(可能包含非坐標字符)。例如:
ferga13fdsf3(100,200)f2r3rfasf(300,400)
輸出描述
最遠足跡坐標,如:
(300,400)
示例
- 輸入:
ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)
輸出:(5,10)
(合法坐標中距離最大) - 輸入:
asfefaweawfaw(0,1)fe
輸出:(0,0)
(坐標非法)
備注
無需處理嵌套括號(如 sfsdfsd((1,2))
)。
Java
問題分析
題目要求從輸入字符串中提取所有合法的坐標,并找到距離總部(0,0)最遠的坐標。若所有坐標均非法,則返回(0,0)。合法坐標需滿足以下條件:
- 格式為(x,y),其中x和y為數字且無前導零(除非數字本身為0,但x和y必須大于0且小于1000)。
- 0 < x < 1000,0 < y < 1000。
解題思路
- 正則匹配:使用正則表達式提取所有可能的坐標。
- 合法性驗證:
- 檢查x和y是否有前導零。
- 檢查x和y的數值范圍是否合法。
- 計算距離:對合法坐標計算其到總部(0,0)的歐氏距離平方(x2 + y2),記錄最大距離對應的坐標。
- 處理邊界:若無合法坐標,返回(0,0)。
代碼實現
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();scanner.close();Pattern pattern = Pattern.compile("\\((\\d+),(\\d+)\\)"); // 匹配(x,y)格式Matcher matcher = pattern.matcher(input);int maxDistance = -1;String maxCoordinate = null;while (matcher.find()) {String xStr = matcher.group(1); // 提取x部分字符串String yStr = matcher.group(2); // 提取y部分字符串// 檢查前導零:若長度>1,則首字符不能為0boolean xValid = (xStr.length() == 1) || (xStr.length() > 1 && xStr.charAt(0) != '0');boolean yValid = (yStr.length() == 1) || (yStr.length() > 1 && yStr.charAt(0) != '0');if (!xValid || !yValid) {continue;}// 轉換為整數并驗證范圍int x = Integer.parseInt(xStr);int y = Integer.parseInt(yStr);if (x <= 0 || x >= 1000 || y <= 0 || y >= 1000) {continue; // 數值非法}// 計算距離int distance = x * x + y * y;if (distance > maxDistance) {maxDistance = distance;maxCoordinate = "(" + x + "," + y + ")"; // 更新最大坐標}}System.out.println(maxCoordinate != null ? maxCoordinate : "(0,0)");}
}
代碼解析
- 正則匹配:
Pattern.compile("\\((\\d+),(\\d+)\\)")
匹配形如(x,y)的字符串,其中\\d+
表示一個或多個數字。 - 提取坐標:
matcher.find()
循環遍歷所有匹配的坐標,group(1)
和group(2)
分別提取x和y的字符串形式。 - 前導零檢查:若x或y的字符串長度大于1且首字符為0,視為非法。
- 數值范圍檢查:將x和y轉換為整數后,檢查是否滿足0 < x < 1000和0 < y < 1000。
- 距離計算:對合法坐標計算x2 + y2,并更新最大距離及對應坐標。
- 結果輸出:若無合法坐標,輸出(0,0),否則輸出最大距離對應的坐標。
示例測試
-
輸入:
ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)
輸出:(5,10)
解釋:合法坐標有(3,10)、(3,4)、(5,10),最大距離為52 + 102 = 125。 -
輸入:
asfefaweawfaw(0,1)fe
輸出:(0,0)
解釋:坐標(0,1)中x=0非法,無合法坐標。 -
輸入:
(01,2)(100,02)(100,999)
輸出:(100,999)
解釋:前兩個坐標因前導零或數值非法被過濾,第三個坐標合法且距離最大。
綜合分析
- 時間復雜度:O(n),其中n為輸入字符串長度。正則匹配和遍歷均為線性復雜度。
- 空間復雜度:O(1),僅需存儲臨時變量。
- 優勢:
- 高效性:正則表達式快速定位坐標,避免逐字符遍歷。
- 魯棒性:嚴格校驗前導零和數值范圍,確保合法坐標正確性。
- 適用性:完美處理題目約束條件,適用于大范圍輸入數據。
python
問題分析
題目要求從輸入字符串中提取所有合法的坐標,并找到距離總部(0,0)最遠的坐標。若所有坐標均非法,則返回(0,0)。合法坐標需滿足以下條件:
- 格式為(x,y),其中x和y為數字且無前導零(除非數字本身為0,但x和y必須大于0且小于1000)。
- 0 < x < 1000,0 < y < 1000。
解題思路
- 正則匹配:使用正則表達式提取所有可能的坐標。
- 合法性驗證:
- 檢查x和y是否有前導零。
- 檢查x和y的數值范圍是否合法。
- 計算距離:對合法坐標計算其到總部(0,0)的歐氏距離平方(x2 + y2),記錄最大距離對應的坐標。
- 處理邊界:若無合法坐標,返回(0,0)。
代碼實現
import redef find_farthest_coordinate(input_str):max_distance = -1max_coord = Nonepattern = re.compile(r'\((\d+),(\d+)\)') # 正則匹配坐標格式for match