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

devtools/2024/10/22 8:42:47/

华为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示例代码,用于实现上述解题思路:

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.006028CNYexchangeRates.put("HKD", 0.123); // 示例汇率,1HKD ≈ 0.123CNYexchangeRates.put("EUR", 0.0703); // 示例汇率,1EUR ≈ 0.0703CNYexchangeRates.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;}}// 关闭Scannerscanner.close();// 打印总金额(以分为单位)System.out.println(totalFen);}
}

六、代码运行解析

假设输入如下:

3
1000JPY
500HKD
20EUR

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

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

2、读取换行符:

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

3、循环读取每行输入:

  • 第一行:1000JPY
java">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"
  • 处理信息:
java">   System.out.println("Processing: 1000JPY");System.out.println("Amount: 1000");System.out.println("Currency: JPY");
  • 转换金额:
java">  int convertedFen = convertToFen("1000", "JPY"); // 1000 * 0.006028 * 100 = 602.8 -> 603System.out.println("Converted to CNY: 603");totalFen += 603; // totalFen = 603
  • 第二行:500HKD
java">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"
  • 处理信息:
java">  System.out.println("Processing: 500HKD");System.out.println("Amount: 500");System.out.println("Currency: HKD");
  • 转换金额:
   int convertedFen = convertToFen("500", "HKD"); // 500 * 0.123 * 100 = 6150System.out.println("Converted to CNY: 6150");totalFen += 6150; // totalFen = 6753
  • 第三行:20EUR
java">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"
  • 处理信息:
java">System.out.println("Processing: 20EUR");
System.out.println("Amount: 20");
System.out.println("Currency: EUR");
  • 转换金额:
java">  int convertedFen = convertToFen("20", "EUR"); // 20 * 0.0703 * 100 = 140.6 -> 141System.out.println("Converted to CNY: 141");totalFen += 141; // totalFen = 6894

4、关闭Scanner:

java">   scanner.close();

5、打印总金额:

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

最终输出:

java">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.ppmy.cn/devtools/127786.html

相关文章

C#学习笔记(十二)

C#学习笔记&#xff08;十二&#xff09; 第九章 面向对象的容器之集合使用和封装特性一、泛型集合 List<T>应用1. 什么是泛型2. 为什么要用集合3. 使用方法 二、泛型字典集合 Dictionary<k,v>应用1. 简介2. 使用方法键的唯一性 三、面向对象编程的封装特性 第九章…

汽车管理系统——登录界面

目录 如何实现登录&#xff1f;登录成功如何显示下一个界面&#xff1f;return a.exec()这边的a是什么对象如何创建数据库中的密码表&#xff1f; 为什么这边添加QT设计师界面类&#xff0c;不是头文件源文件如何获取文本框内的信息密码不一定是整型&#xff0c;需要用字符串&a…

【状态机DP】力扣1262. 可被三整除的最大和

给你一个整数数组 nums&#xff0c;请你找出并返回能被三整除的元素 最大和。 示例 1&#xff1a; 输入&#xff1a;nums [3,6,5,1,8] 输出&#xff1a;18 解释&#xff1a;选出数字 3, 6, 1 和 8&#xff0c;它们的和是 18&#xff08;可被 3 整除的最大和&#xff09;。 示…

OSI参考模型与TCP/IP模型

OSI参考模型 物理层 定义电压、接口、线缆标准、传输距离、传输介质等物理参数。数据链路层&#xff08;确定范围里的某一个&#xff09; MAC地址寻址网络层&#xff08;确定一个范围&#xff09; 网络地址层寻址、路由传输层&#xff08;区分不同的程序&#xff09; 数据分段…

手机淘宝自动下单退货自动化RPA脚本机器人

使用手机集线器连接多个手机并发运行。 脚本分3个部分&#xff08;读取本地连接下单&#xff0c;退货获取退货地址信息&#xff0c;填写快递单号&#xff09; 脚本部分图结构看下面的图片 部分数据统计展示

估值与周期风险评估(2024/6/30)

这是每周最重要的文章。是我投资理论体系到实盘实战的运用。一套稳定的投资体系是我长期获利的源泉。一是明确长期估值和对应的整体仓位。二是明确短期风险状态和对应的网格交易计划。每周日视频讲解实盘&#xff0c;交流本周估值与下周网格计划。用我公开九年的实盘&#xff0…

Linux的find命令使用指南及实际shell用例

Linux的find命令使用指南及实际shell用例 基本语法常用选项实际shell用例 find命令是Linux和UNIX系统中一个非常强大的工具&#xff0c;它用于在指定目录下根据给定条件搜索文件。find命令功能强大&#xff0c;使用灵活&#xff0c;可以组合多种条件和选项来精确查找文件&#…

程序员的浪漫之给对象爬数据,没想到过程中竟然被写接口的老哥字段命名给秀到了!

目录 一、序言二、分析需求三、找数据分析字段四、建个表开爬数据五、结语 一、序言 最近对象转了销售岗&#xff0c;她的领导布置了项任务&#xff0c;一周要找500个对标客户的联系电话。看她又上天眼查、企查查、爱企查&#xff0c;还上各种采购平台手动抄采购负责人的信息和…