华为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.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、读取换行符:

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 -> 603System.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 = 6150System.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 -> 141System.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.mzph.cn/diannao/56835.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Hive】6-Hive函数、运算符使用

Hive函数、运算符使用 Hive内置运算符 概述 整体上&#xff0c;Hive支持的运算符可以分为三大类&#xff1a;关系运算、算术运算、逻辑运算。 官方参考文档&#xff1a;https://cwiki.apache.org/confluence/display/Hive/LanguageManualUDF 也可以使用下述方式查看运算符的…

2024年AI 制作PPT新宠儿,3款神器集锦,让你的演示与众不同

咱们今儿聊聊最近超火的AI做PPT的工具。这年头&#xff0c;谁不想省事儿&#xff0c;少熬夜加班&#xff0c;多享受享受生活啊&#xff1f;所以&#xff0c;AI开始帮咱们搞定做PPT这种费时的活儿&#xff0c;我自然得好好研究研究。今天&#xff0c;我就给大家详细说说三款很火…

Linux下的进程解析(level 2)

目录 引言 pid解析 /proc 系统调用 fork &#xff1a;创建子进程 执行流分析 父子进程谁先运行 引言 在当今的信息技术时代&#xff0c;操作系统作为计算机系统的核心组件&#xff0c;承担着资源管理、任务调度等重要职责。Linux作为一种开源、高性能的操作系统&#xf…

第11篇:网络安全协议

目录 引言 11.1 安全套接字层&#xff08;SSL&#xff09;和传输层安全&#xff08;TLS&#xff09;协议 11.1.1 SSL/TLS 的工作原理 11.1.2 SSL/TLS 的应用场景 11.2 虚拟专用网&#xff08;VPN&#xff09;和 IP 安全协议&#xff08;IPSec&#xff09; 11.2.1 VPN 的工…

《深度学习》OpenCV EigenFaces算法 人脸识别

目录 一、EigenFaces算法 1、什么是EigenFaces算法 2、原理 3、实现步骤 1&#xff09;数据预处理 2&#xff09;特征提取 3&#xff09;构建模型 4&#xff09;识别 4、优缺点 1&#xff09;优点 2&#xff09;缺点 二、案例实现 1、完整代码 运行结果&#xff…

9.存储过程安全性博客大纲(9/10)

存储过程安全性博客大纲 引言 在数据库系统中&#xff0c;存储过程是一种预先编写好的SQL代码集合&#xff0c;它被保存在数据库服务器上&#xff0c;可以通过指定的名称来调用执行。存储过程可以包含一系列的控制流语句&#xff0c;如IF条件语句、WHILE循环等&#xff0c;使…

「从零开始的 Vue 3 系列」:第十一章——跨域问题解决方案全解析

前言 本系列将从零开始&#xff0c;系统性地介绍 Vue 3 的常用 API&#xff0c;逐步深入每个核心概念与功能模块。通过详尽的讲解与实战演示&#xff0c;帮助大家掌握 Vue 3 的基础与进阶知识&#xff0c;最终具备独立搭建完整 Vue 3 项目的能力。 第十一章&#xff1a;跨域问…

Win32图片库CxImage在vs2022下的编译和使用

一、编译CxImage库 1、下载CxImage_702库的源码:在下面的链接中下载cximage702_full.7z https://sourceforge.net/projects/cximage/files/7.02/ 2、解压到某一目录&#xff0c;vs2022打开CxImageFull_vc10.sln解决方案文件&#xff0c;提示升级点确定 3、先编译下面的这几…

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有&#xff0c;个人中心&#xff0c;用户管理&#xff0c;中介管理&#xff0c;房屋信息管理&#xff…

[Linux] 逐层深入理解文件系统 (2)—— 文件重定向

标题&#xff1a;[Linux] 逐层深入理解文件系统 &#xff08;2&#xff09;—— 文件重定向 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; 目录 一、文件的读取和写入 二、文件重定向的本质 1.手动模拟重定向的过程——把标准输出重定向到redir.txt 2.重定向…

019_基于python+django食品销售数据分析系统2024_4032ydxt

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

基于SpringBoot的“社区医院管理服务系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“社区医院管理服务系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 用户注册界面图 医生界面…

这4款实用的工具简直就是硬盘数据丢失的救星。

硬盘数据丢失的情况有很多种&#xff0c;像误删除&#xff0c;格式化&#xff0c;病毒攻击&#xff0c;硬件故障等等。如果不是物理上的损坏&#xff0c;丢失的数据还是可以通过一些方法进行恢复的。这里就跟大家分享几款可以进行数据恢复的专业数据件&#xff0c;希望可以帮助…

Apache Seatunnel Zeta引擎-启动脚本分析

Apache SeaTunnel Zeta引擎的集群模式启动的第一步是执行bin/seatunnel-cluster.sh脚本&#xff0c;所以先来学习下这个脚本。 脚本执行流程分析 脚本简要注释 #!/bin/bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license a…

设计模式02-桥接模式(Java)

4.2 桥接模式 **1.定义&#xff1a;**将抽象与实现分离&#xff0c;使它们可以独立变化。它是用组合关系代替继承关系来实现&#xff0c;从而降低了抽象和实现这两个可变维度的耦合度。 2.结构&#xff1a; 抽象化角色 &#xff1a;定义抽象类&#xff0c;并包含一个对实现化…

你的电脑能不能安装windows 11,用这个软件检测下就知道了

为了应对Windows 11的推出&#xff0c;一款名为WhyNotWin11的创新型诊断软件应运而生。这个强大的工具不仅仅是一个简单的兼容性检测器&#xff0c;它更像是一位细心的数字医生&#xff0c;全方位评估您的计算机是否准备好迎接微软最新操作系统的挑战。 WhyNotWin11的功能远超…

【动手学深度学习】8.3 语言模型(个人向笔记)

下面是语言模型的简介 1. 学习语言模型 使用计数来建模 N元语法&#xff1a;这里的元可以理解为我们之前的时间变量。对于 N 元语法&#xff0c;我们可以把所有长度为 N 的子序列存下来。其中 1 元语法用的很少。这里其实就是算概率的时候我们不往前看所有的概率&#xff0c;…

前端遮罩层的应用

最近微信小程序需要开发新手引导功能&#xff0c;发现需要在遮罩层中间抠一个洞出来&#xff0c;但是一直不知道该怎么去做&#xff0c;其实很简单&#xff0c;先展示源码&#xff1a; <template><div class"num01">hello<div class"mask"&…

ai字幕用什么软件制作?6款视频加字幕工具分享!

在视频制作和后期处理中&#xff0c;字幕的添加是一个重要的环节。随着AI技术的发展&#xff0c;越来越多的软件开始支持AI自动加字幕功能&#xff0c;使得字幕的制作变得更加简单和高效。本文将为大家介绍几款常用的AI字幕制作软件&#xff0c;并详细讲解如何使用AI自动加字幕…

【MySQL 保姆级教学】在Linux(CentoS 7)中安装MySQL(1)

目录 1. 卸载linux&#xff08;Centos7&#xff09; 中不要的环境2. 获取MySQL官方yum源2.1 获取yum源前先查看自己 linux&#xff08;Centos&#xff09;的版本2.2 获取官方yum源 3. 安装xftp和连接4. 开放连接端口5. 上传文件到Centos76. 安装MySQL6.1 顺利安装6.2 查询是否安…