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 =