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

发布于:2025-05-25 ⋅ 阅读:(23) ⋅ 点赞:(0)

在这里插入图片描述

2025 B卷 100分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享

华为OD机试真题《货币单位换算》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C++

C

GO


题目名称:货币单位换算


  1. 知识点:字符串解析、逻辑处理
  2. 时间限制:1秒
  3. 空间限制:256MB
  4. 限定语言:不限

题目描述

记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。

  • 输入格式
    • 第一行输入整数N(0 < N < 100),表示记录数。
    • 接下来N行,每行一条货币记录,格式为“数字+货币单位”(如100CNY53HKD87cents)。货币单位可能是单独元(如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),并汇总所有金额的整数值。输入包含若干货币记录,每个记录可能包含元和分的组合,需要根据汇率表统一转换为人民币分后求和。


解题思路

  1. 汇率映射:根据题目提供的汇率表,建立元和分单位的转换率映射表。
  2. 字符串解析:使用正则表达式提取金额记录中的数值和单位。
  3. 金额转换:根据单位匹配对应的转换率,将金额转换为人民币分。
  4. 汇总输出:累加所有转换后的金额,取整数部分输出。

代码实现

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); // 输出整数部分
    }
}

代码解析

  1. 汇率表初始化

    static {
         
        yuanRates.put("CNY", 100.0);
        // 其他元单位汇率...
        fenRates.put("fen", 1.0);
        // 其他分单位汇率...
    }
    
    • yuanRates存储元单位到人民币分的转换率,fenRates存储分单位的转换率。
  2. 输入处理

    Scanner scanner = new Scanner(System.in);
    int N = scanner.nextInt();
    scanner.nextLine(); // 跳过换行符
    
    • 读取记录数N,并处理换行符问题。
  3. 正则表达式匹配

    Pattern pattern = Pattern.compile("(\\d+)([A-Za-z]+)");
    Matcher matcher = pattern.matcher(line);
    
    • 使用正则表达式(\d+)([A-Za-z]+)匹配金额记录中的数值和单位。
  4. 金额转换逻辑

    while (matcher.find()) {
         
        int amount = Integer.parseInt(matcher.group(1));
        String unit = matcher.group(2);
        // 查找汇率并计算fen值...
    }
    
    • 提取每个部分的数值和单位,根据单位类型查找对应汇率并转换为人民币分。
  5. 累加与输出

    totalFen += lineSum;
    System.out.println

网站公告

今日签到

点亮在社区的每一天
去签到