当前位置: 首页 > article >正文

华为OD机试真题---货币单位换算

华为OD机试真题中的“货币单位换算”题目是一道考察编程能力、数学计算以及对不同货币单位理解的综合性题目。以下是对该题目的详细解析:

一、题目描述

记账本上记录了若干条多国货币金额,需要将这些金额全部换算成人民币分(fen)后进行汇总,并最终输出汇总结果。每行记录一条金额,金额带有货币单位,可能是单独元、单独分、或者元与分的组合。汇率以及不同货币单位与人民币的换算关系在题目中会给出。

二、输入与输出

  • 输入

    • 第一行输入为整数N,表示记录数(0 < N < 100)。
    • 接下来N行,每行表示一条货币记录,格式为“金额货币单位”,其中金额可能是整数或小数,货币单位可能是单独元、单独分、或者元与分的组合(但题目中已明确给出的是标准货币单位,如JPY、HKD等,因此这里的“元与分的组合”应理解为货币单位内部的细分,如日元中的“元”和“仙”)。
  • 输出

    • 将所有货币记录换算成人民币分(fen)后汇总求和,只保留整数部分,小数部分舍弃。
    • 输出格式只有整数数字,不带小数和单位。

三、汇率及换算关系

  • 1CNY = 100fen(1元 = 100分)
  • 1HKD = 100cents(1港元 = 100港分)
  • 1JPY = 100sen(1日元 = 100仙)
  • 1EUR = 100eurocents(1欧元 = 100欧分)
  • 1GBP = 100pence(1英镑 = 100便士)
  • 汇率示例:100CNY = 1825JPY = 123HKD = 14EUR = 12GBP(具体汇率可能会根据题目要求有所变化)

四、解题思路

  1. 读取输入

    • 使用Scanner类读取输入,首先读取记录数N,然后依次读取N行货币记录。
    • 对每行输入进行预处理,去除空格和换行符。
  2. 解析货币记录

    • 使用正则表达式或字符串分割方法提取金额和货币单位。
    • 验证货币单位是否在汇率表中存在,若不存在则打印错误信息并跳过当前行。
  3. 换算成人民币分

    • 根据汇率将金额换算成人民币元。
    • 将人民币元乘以100,得到人民币分。
    • 使用Math.round()函数对结果进行四舍五入,但由于题目要求只保留整数部分,因此最终需要舍弃小数部分(可以通过类型转换或取整操作实现)。
  4. 汇总求和

    • 使用一个整数变量来记录总金额(以分为单位)。
    • 将每条货币记录换算后的人民币分累加到总金额中。
  5. 输出结果

    • 将总金额以整数形式输出,不带小数和单位。

五、示例代码

以下是一个简单的java示例代码,用于实现上述解题思路:



import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class CurrencyConversion {

    /**
     * 汇率表(示例,实际应根据题目给出的汇率表进行替换)
     */
    private static final Map<String, Double> exchangeRates = new HashMap<>();

    static {
        exchangeRates.put("CNY", 1.0); // 人民币无需转换
        exchangeRates.put("JPY", 0.006028); // 示例汇率,1JPY ≈ 0.006028CNY
        exchangeRates.put("HKD", 0.123); // 示例汇率,1HKD ≈ 0.123CNY
        exchangeRates.put("EUR", 0.0703); // 示例汇率,1EUR ≈ 0.0703CNY
        exchangeRates.put("GBP", 0.1008); // 示例汇率,1GBP ≈ 0.1008CNY
        // 其他货币汇率可按需添加
    }

    /**
     * 将货币金额转换成人民币分
     *
     * @param amount  货币金额字符串,例如 "100USD"
     * @param currency 货币单位,例如 "USD"
     * @return 转换成人民币分后的值
     */
    private static int convertToFen(String amount, String currency) {
        // 提取数字并转换
        double valueInCNY = Double.parseDouble(amount.replaceAll("\\D+", "")) * exchangeRates.get(currency);
        // 转换成人民币分并四舍五入
        int fen = (int) Math.round(valueInCNY * 100);
        return fen;
    }

    public static void main(String[] args) {
        // 使用Scanner读取输入
        Scanner scanner = new Scanner(System.in);
        // 读取输入的行数
        int N = scanner.nextInt();
        // 读取换行符
        scanner.nextLine();

        // 初始化总金额(以分为单位)
        int totalFen = 0;

        // 循环读取每行输入
        for (int i = 0; i < N; i++) {
            // 读取一行输入并去除行首和行尾的空格
            String line = scanner.nextLine().trim();
            // 分割输入为数字和货币单位两部分
            String[] parts = line.split("(?=\\p{Alpha}+$)", 2);

            // 如果输入格式不正确,则打印错误信息并跳过当前行
            if (parts.length < 2) {
                System.out.println("Invalid input format: " + line);
                continue;
            }

            // 提取并处理金额部分
            String amount = parts[0].trim();
            // 提取并处理货币单位部分
            String currency = parts[1].trim().toUpperCase();

            // 打印处理信息
            System.out.println("Processing: " + line);
            System.out.println("Amount: " + amount);
            System.out.println("Currency: " + currency);

            // 如果汇率表中存在该货币,则进行转换并累加到总金额
            if (exchangeRates.containsKey(currency)) {
                int convertedFen = convertToFen(amount, currency);
                System.out.println("Converted to CNY: " + convertedFen);
                totalFen += convertedFen;
            } else {
                // 如果汇率表中不存在该货币,则打印错误信息并跳过当前行
                System.out.println("Currency " + currency + " not found in exchange rates.");
                continue;
            }
        }

        // 关闭Scanner
        scanner.close();
        // 打印总金额(以分为单位)
        System.out.println(totalFen);
    
    }
}

六、代码运行解析

假设输入如下:

3
1000JPY
500HKD
20EUR

运行过程及输出:
1、读取输入的行数:

   int N = scanner.nextInt(); // N = 3

2、读取换行符:

scanner.nextLine(); // 读取换行符

3、循环读取每行输入:

  • 第一行:1000JPY
String line = scanner.nextLine().trim(); // line = "1000JPY"
String[] parts = line.split("(?=\\p{Alpha}+$)", 2); // parts = ["1000", "JPY"]
String amount = parts[0].trim(); // amount = "1000"
String currency = parts[1].trim().toUpperCase(); // currency = "JPY"
  • 处理信息:
   System.out.println("Processing: 1000JPY");
   System.out.println("Amount: 1000");
   System.out.println("Currency: JPY");
  • 转换金额:
  int convertedFen = convertToFen("1000", "JPY"); // 1000 * 0.006028 * 100 = 602.8 -> 603
   System.out.println("Converted to CNY: 603");
   totalFen += 603; // totalFen = 603
  • 第二行:500HKD
String line = scanner.nextLine().trim(); // line = "500HKD"
 String[] parts = line.split("(?=\\p{Alpha}+$)", 2); // parts = ["500", "HKD"]
 String amount = parts[0].trim(); // amount = "500"
 String currency = parts[1].trim().toUpperCase(); // currency = "HKD"
  • 处理信息:
  System.out.println("Processing: 500HKD");
   System.out.println("Amount: 500");
   System.out.println("Currency: HKD");
  • 转换金额:
   int convertedFen = convertToFen("500", "HKD"); // 500 * 0.123 * 100 = 6150
   System.out.println("Converted to CNY: 6150");
   totalFen += 6150; // totalFen = 6753
  • 第三行:20EUR
String line = scanner.nextLine().trim(); // line = "20EUR"
String[] parts = line.split("(?=\\p{Alpha}+$)", 2); // parts = ["20", "EUR"]
String amount = parts[0].trim(); // amount = "20"
String currency = parts[1].trim().toUpperCase(); // currency = "EUR"
  • 处理信息:
System.out.println("Processing: 20EUR");
System.out.println("Amount: 20");
System.out.println("Currency: EUR");
  • 转换金额:
  int convertedFen = convertToFen("20", "EUR"); // 20 * 0.0703 * 100 = 140.6 -> 141
   System.out.println("Converted to CNY: 141");
   totalFen += 141; // totalFen = 6894

4、关闭Scanner:

   scanner.close();

5、打印总金额:

   System.out.println(totalFen); // 输出 6894

最终输出:

Processing: 1000JPY
Amount: 1000
Currency: JPY
Converted to CNY: 603
Processing: 500HKD
Amount: 500
Currency: HKD
Converted to CNY: 6150
Processing: 20EUR
Amount: 20
Currency: EUR
Converted to CNY: 141
6894

注意:上述代码是一个简化的示例,具体实现时需要根据题目要求调整汇率和换算关系。此外,由于题目中要求只保留整数部分,小数部分舍弃。

七、详细扩展解析

1. 输入处理

在读取输入时,我们需要确保能够正确解析整数N以及后续的N行货币记录。使用Scanner类可以方便地读取标准输入。注意,在读取整数N后,需要调用nextLine()方法来消耗掉换行符,否则在读取第一行货币记录时会读取到空行。

2. 货币记录解析

每条货币记录由金额和货币单位组成,两者之间可能有空格或其他分隔符。为了准确提取金额和货币单位,我们可以使用正则表达式或字符串分割方法。在示例代码中,使用了split("(?=\\p{Alpha}+$)", 2)来进行分割,这个正则表达式的意思是在字母序列之前进行分割,且最多分割成两部分,这样可以确保金额和货币单位被正确分离。

3. 金额转换

在将金额转换成人民币分时,需要注意以下几点:

  • 金额提取:使用正则表达式\\D+来匹配并去除金额中的非数字字符,从而提取出纯数字部分。
  • 汇率应用:根据货币单位从汇率表中获取对应的汇率,并将金额乘以该汇率得到人民币元。
  • 单位转换:将人民币元乘以100得到人民币分。
  • 四舍五入:虽然题目要求只保留整数部分,但为了避免精度损失,可以先使用Math.round()进行四舍五入,然后再转换为整数。不过,由于最终要舍弃小数部分,所以直接转换为整数类型(如int)也是可以的,这样会自动舍弃小数部分。
4. 汇率表管理

汇率表是一个关键的数据结构,它存储了不同货币单位与人民币之间的换算关系。在示例代码中,使用了HashMap来存储汇率表,其中键是货币单位的字符串表示(大写),值是对应的汇率。这样做的好处是查找速度快,且易于管理。

5. 错误处理

在处理输入时,可能会遇到格式不正确的货币记录或汇率表中不存在的货币单位。为了增强代码的健壮性,需要添加相应的错误处理逻辑。在示例代码中,当遇到格式不正确的货币记录时,会打印错误信息并跳过当前行;当遇到汇率表中不存在的货币单位时,也会打印错误信息并跳过当前行。

6. 示例代码优化

虽然示例代码已经能够完成题目要求的任务,但在实际应用中还可以进行以下优化:

  • 输入验证:增加对输入数据的验证,如检查金额是否为合法数字、货币单位是否为空等。
  • 异常处理:使用try-catch语句块来捕获并处理可能的异常,如NumberFormatException等。
  • 代码复用:将重复的代码封装成方法或类,提高代码的可读性和可维护性。
  • 性能优化:如果输入数据量很大,可以考虑使用更高效的数据结构或算法来优化性能。
7. 扩展功能

除了完成题目要求的任务外,还可以考虑添加以下扩展功能:

  • 支持多种输入格式:如支持金额和货币单位之间使用不同分隔符的情况。
  • 支持更多货币单位:根据实际需求添加更多的货币单位及其汇率。
  • 支持货币单位缩写:如支持“USD”表示美元、“EUR”表示欧元等。
  • 输出格式化:根据实际需求对输出进行格式化,如添加前缀或后缀等。

综上所述,通过对输入处理、货币记录解析、金额转换、汇率表管理、错误处理以及示例代码优化等方面的详细分析,我们可以更好地理解并实现“货币单位换算”这道题目。同时,还可以根据实际需求进行功能扩展和优化。


http://www.kler.cn/news/356880.html

相关文章:

  • 单独配置LVS负载均衡服务器+web
  • C#学习笔记(四)
  • TCP/IP传输协议,易懂!!!
  • PHP(一)从入门到放弃
  • 速盾:cdn 速度取决于什么?
  • 【H2O2|全栈】关于CSS(14)如何完成常规的页面布局
  • 简单实现通过电脑操作手机
  • 【优选算法】探索双指针之美(一):双指针与单调性的完美邂逅
  • MySQL 异常: “Host ‘xxx‘ is not allowed to connect to this MySQL server“
  • IMX6UL的RGB的显示实验
  • 一起搭WPF架构之LiveCharts.Wpf的简单了解与安装
  • 微信小程序-封装通用模块
  • Mac 远程 Windows 等桌面操作系统工具 Microsoft Remote Desktop for Mac 下载安装详细使用教程
  • 《仓库猎手模拟》风灵月影游戏辅助使用教程
  • 数据库原理与应用(基于MySQL):实验六数据查询
  • 【Golang】Go语言http编程底层逻辑实现原理与实战
  • 大数据治理:技术挑战与解决方案
  • 免杀对抗—内存加载UUID标识IPV4地址MAC地址
  • webpack自定义插件 ChangeScriptSrcPlugin
  • 结合seata和2PC,简单聊聊seata源码