2025 A卷 100分 題型
本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式;
并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析;
本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分享》
華為OD機試真題《出租車計費/靠譜的車 》:
文章快捷目錄
題目描述及說明
Java
python
JavaScript
C++
C
GO
題目名稱:出租車計費/靠譜的車
知識點:進制轉換(9進制映射)、字符串處理
時間限制:1秒
空間限制:256MB
語言限制:不限
題目描述
程序員小明打了一輛出租車去上班。出于職業敏感,他注意到這輛出租車的計費表有點問題,總是偏大。出租車司機解釋說他不喜歡數字 4,所以改裝了計費表,任何數字位置遇到數字4就直接跳過,其余功能正常。例如:
- 23再多一塊錢就變為25(跳過24);
- 39再多一塊錢變為50(跳過40-49);
- 399再多一塊錢變為500(跳過400-499)。
小明需要根據計費表的表面讀數 N,返回實際產生的費用。
輸入描述
一行數字 N,表示里程表的讀數(1 ≤ N ≤ 888,888,888)。
輸出描述
一個數字,表示實際費用。
示例
- 輸入:
5
→ 輸出:4
(跳過4) - 輸入:
17
→ 輸出:15
(跳過4、14) - 輸入:
100
→ 輸出:81
(跳過4、14、24、…、94)
Java
問題分析
題目要求根據改裝后的出租車計費表讀數 N,計算出實際費用。計費表跳過了所有包含數字 4 的數值,例如 4、14、24、40-49 等。我們需要將 N 轉換為實際費用,即排除所有含 4 的數值后的順序位置。
解題思路
- 進制轉換思想:將計費表讀數 N 視為一個“偽九進制”數。每個數字位的有效范圍是 0-8,其中原數字若大于 4 則需要減 1(因為跳過了數字 4)。
- 逐位處理:遍歷 N 的每一位數字,按規則調整后,將整個數視為九進制轉換為十進制,得到實際費用。
代碼實現
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String n = scanner.nextLine().trim(); // 讀取輸入并去除首尾空格long result = 0; // 存儲實際費用的結果// 遍歷輸入字符串的每一位字符for (int i = 0; i < n.length(); i++) {char c = n.charAt(i); // 當前位的字符int digit = c - '0'; // 轉換為數字// 如果當前位數字大于4,則減1(跳過數字4)if (digit > 4) {digit--;}// 將調整后的數字視為九進制數,逐位轉換為十進制result = result * 9 + digit;}System.out.println(result); // 輸出實際費用}
}
代碼解析
-
輸入處理:
String n = scanner.nextLine().trim()
:讀取輸入字符串并去除首尾空格。- 例如輸入
"100"
,處理后得到"100"
。
-
遍歷每一位字符:
for (int i = 0; i < n.length(); i++)
:循環處理每一位數字。char c = n.charAt(i)
:取出第 i 位的字符。int digit = c - '0'
:將字符轉換為數字,例如'5' → 5
。
-
調整數字位:
if (digit > 4) { digit--; }
:若當前位大于 4,則減 1。例如5 → 4
,7 → 6
。
-
九進制轉十進制:
result = result * 9 + digit
:每一步將結果乘以 9(進制基數),并加上當前位的值。- 例如輸入
"100"
,處理后的各位為1, 0, 0
,計算過程為:0*9 + 1 = 1
1*9 + 0 = 9
9*9 + 0 = 81
示例測試
-
輸入:5
- 調整后的數字位:4
- 計算過程:
0*9 + 4 = 4
- 輸出:4
-
輸入:17
- 調整后的數字位:1 → 1,7 → 6
- 計算過程:
0*9 + 1 = 1
→1*9 + 6 = 15
- 輸出:15
-
輸入:100
- 調整后的數字位:1 → 1,0 → 0,0 → 0
- 計算過程:
0*9 + 1 = 1
→1*9 + 0 = 9
→9*9 + 0 = 81
- 輸出:81
綜合分析
-
時間復雜度:O(n)
- 只需遍歷輸入字符串一次,時間復雜度與輸入長度線性相關。
-
空間復雜度:O(1)
- 僅需常數空間存儲中間變量。
-
正確性保證:
- 進制轉換思想:通過將計費表讀數視為九進制數,嚴格對應排除數字 4 后的數值順序。
- 邊界處理:正確處理每一位數字的調整邏輯,確保所有含 4 的數值被跳過。
-
優勢:
- 高效:線性時間復雜度,適用于最大輸入(888,888,888)。
- 簡潔:代碼邏輯清晰,直接映射問題模型。
-
適用場景:
- 適用于所有需要處理數字跳過的場景,例如類似的進制轉換問題。
python
問題分析
出租車計費表跳過了所有含數字4的數值。例如,顯示5時實際費用是4(跳過了4),顯示17時實際是15(跳過4、14)。我們需要將顯示數值轉換為真實費用,相當于將數值轉換到排除4的"偽九進制"體系中。
解題思路
- 進制轉換思想:將每個數字位視為0-8范圍(排除4),等效于九進制。
- 逐位調整:對于每一位數字,若大于4則減1(跳過4),然后整體按九進制轉十進制。
代碼實現
n =