2025 B卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《货币单位换算》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C++
C
GO
题目名称:货币单位换算
- 知识点:字符串解析、逻辑处理
- 时间限制:1秒
- 空间限制:256MB
- 限定语言:不限
题目描述
记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。
- 输入格式:
- 第一行输入整数N(0 < N < 100),表示记录数。
- 接下来N行,每行一条货币记录,格式为“数字+货币单位”(如
100CNY
、53HKD87cents
)。货币单位可能是单独元(如CNY
)、单独分(如fen
),或元与分的组合(如20CNY53fen
)。
- 汇率规则:
- 1CNY = 100fen(人民币)
- 1HKD = 100cents(港元)
- 1JPY = 100sen(日元)
- 1EUR = 100eurocents(欧元)
- 1GBP = 100pence(英镑)
- 汇率表:
100CNY = 1825JPY = 123HKD = 14EUR = 12GBP
。
- 输出要求:
- 将所有货币换算为人民币分后汇总,仅保留整数部分(舍弃小数),输出不带单位。
示例
输入1:
1
100CNY
输出1:
10000
输入2:
2
20CNY53fen
53HKD87cents
输出2:
6432
Java
问题分析
我们需要将不同国家的货币金额转换为人民币分(fen),并汇总所有金额的整数值。输入包含若干货币记录,每个记录可能包含元和分的组合,需要根据汇率表统一转换为人民币分后求和。
解题思路
- 汇率映射:根据题目提供的汇率表,建立元和分单位的转换率映射表。
- 字符串解析:使用正则表达式提取金额记录中的数值和单位。
- 金额转换:根据单位匹配对应的转换率,将金额转换为人民币分。
- 汇总输出:累加所有转换后的金额,取整数部分输出。
代码实现
import java.util.*;
import java.util.regex.*;
public class Main {
// 元单位到人民币分的转换率
private static Map<String, Double> yuanRates = new HashMap<>();
// 分单位到人民币分的转换率
private static Map<String, Double> fenRates = new HashMap<>();
static {
// 初始化元单位汇率
yuanRates.put("CNY", 100.0);
yuanRates.put("HKD", 10000.0 / 123);
yuanRates.put("JPY", 10000.0 / 1825);
yuanRates.put("EUR", 10000.0 / 14);
yuanRates.put("GBP", 10000.0 / 12);
// 初始化分单位汇率
fenRates.put("fen", 1.0);
fenRates.put("cents", 100.0 / 123);
fenRates.put("sen", 100.0 / 1825);
fenRates.put("eurocents", 100.0 / 14);
fenRates.put("pence", 100.0 / 12);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
scanner.nextLine(); // 跳过读取剩余行
double totalFen = 0.0;
Pattern pattern = Pattern.compile("(\\d+)([A-Za-z]+)"); // 正则匹配数字+单位
for (int i = 0; i < N; i++) {
String line = scanner.nextLine();
Matcher matcher = pattern.matcher(line);
double lineSum = 0.0;
while (matcher.find()) {
int amount = Integer.parseInt(matcher.group(1)); // 提取数值
String unit = matcher.group(2); // 提取单位
Double rate = yuanRates.get(unit); // 查找元单位汇率
if (rate != null) {
lineSum += amount * rate;
} else {
rate = fenRates.get(unit); // 查找分单位汇率
if (rate != null) {
lineSum += amount * rate;
}
}
}
totalFen += lineSum; // 累加当前行总fen
}
System.out.println((long) totalFen); // 输出整数部分
}
}
代码解析
汇率表初始化
static { yuanRates.put("CNY", 100.0); // 其他元单位汇率... fenRates.put("fen", 1.0); // 其他分单位汇率... }
yuanRates
存储元单位到人民币分的转换率,fenRates
存储分单位的转换率。
输入处理
Scanner scanner = new Scanner(System.in); int N = scanner.nextInt(); scanner.nextLine(); // 跳过换行符
- 读取记录数N,并处理换行符问题。
正则表达式匹配
Pattern pattern = Pattern.compile("(\\d+)([A-Za-z]+)"); Matcher matcher = pattern.matcher(line);
- 使用正则表达式
(\d+)([A-Za-z]+)
匹配金额记录中的数值和单位。
- 使用正则表达式
金额转换逻辑
while (matcher.find()) { int amount = Integer.parseInt(matcher.group(1)); String unit = matcher.group(2); // 查找汇率并计算fen值... }
- 提取每个部分的数值和单位,根据单位类型查找对应汇率并转换为人民币分。
累加与输出
totalFen += lineSum; System.out.println