华为OD机试真题—— 货币单位换算(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
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