货币单位换算 - 华为OD统一考试(E卷)
2024华为OD机试(E卷+D卷)最新题库【超值优惠】Java/Python/C++合集
题目描述
记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。
每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。
要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃。
元和分的换算关系都是1:100,如下:
- 1CNY=100fen(1元=100分)
- 1HKD=100cents(1港元=100港分)
- 1JPY=100sen(1日元=100仙)
- 1EUR=100eurocents(1欧元=100欧分)
- 1GBP=100pence(1英镑=100便士)
汇率如下表
100 | 1825 | 123 | 14 | 12 |
即100CNY=1825JPY=123HKD=14EUR=12GBP
输入描述
第一行输入为N,N表示记录数。0<N<100
之后N行,每行表示一条货币记录,且该行只会是一种货币。
输出描述
将每行货币转换成人民币分(fen)后汇总求和,只保留整数部分,
输出格式只有整数数字,不带小数,不带单位。
示例1
输入:
1
100CNY
输出:
10000
说明:
100CNY转换后是10000fen,所以输出结果为10000
题解
该题目属于 字符串处理 和 哈希映射 结合的类型问题。核心思想是通过字符串解析和单位转换将不同货币转换为统一的人民币分(fen),然后进行汇总。它可以归为 字符串处理 和 数学计算 类问题。
解题思路
- 解析输入:对于每一行输入的货币记录,我们首先需要从字符串中提取出金额和货币单位。货币单位可能是元(CNY、JPY等)或者分(fen、cents等),因此需要精确提取。
- 建立汇率表:使用哈希映射 (在不同语言中分别为
map
、HashMap
或dict
) 来存储每种货币单位相对于人民币分的换算关系。- 转换为人民币分:根据提取的货币单位,通过汇率表将其转换为人民币分(fen)。
- 汇总求和:处理完所有货币记录后,对其进行汇总,只保留整数部分,舍弃小数。
- 输出结果:最终结果只需要输出整数形式的总和。
代码大致描述
- 初始化汇率表:将所有相关货币的单位转换汇率存入一个哈希映射(例如,
"CNY": 100.0
,"JPY": (100 / 1825.0) * 100
)。- 解析字符串:遍历每一行货币记录,提取出货币单位和数值。
- 查找汇率并进行转换:利用提取的货币单位从哈希映射中查找对应汇率,并将货币值转换为人民币分。
- 结果汇总:将转换后的分值进行累加,输出结果。
时间复杂度
时间复杂度为 O(N),其中 N 是货币记录的条数。因为每一条记录的处理时间为常数时间级别,包括字符串的解析和汇率的查找。
空间复杂度
空间复杂度为 O(1),除去输入数据以外,哈希映射的大小是固定的,汇率表中只有少量固定货币单位。
Java
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* @author code5bug
*/
public class Main {
// 使用静态常量定义汇率
private static final double JPY_RATE = 1825.0;
private static final double HKD_RATE = 123.0;
private static final double EUR_RATE = 14.0;
private static final double GBP_RATE = 12.0;
// 初始化汇率
public static void init(Map<String, Double> exchange) {
exchange.put("fen", 1.0);
exchange.put("CNY", 100.0);
exchange.put("JPY", (100.0 / JPY_RATE) * 100);
exchange.put("sen", (100.0 / JPY_RATE));
exchange.put("HKD", (100.0 / HKD_RATE) * 100);
exchange.put("cents", (100.0 / HKD_RATE));
exchange.put("EUR", (100.0 / EUR_RATE) * 100);
exchange.put("eurocents", (100.0 / EUR_RATE));
exchange.put("GBP", (100.0 / GBP_RATE) * 100);
exchange.put("pence", (100.0 / GBP_RATE));
}
// 处理输入的字符串,计算结果
public static double processInput(String line, Map<String, Double> exchange) {
int len = line.length();
double result = 0;
int j = 0;
while (j < len) {
int num = 0;
StringBuilder unit = new StringBuilder();
// 解析数字部分
while (j < len && Character.isDigit(line.charAt(j))) {
num = num * 10 + (line.charAt(j) - '0');
j++;
}
// 解析货币单位部分
while (j < len && Character.isLetter(line.charAt(j))) {
unit.append(line.charAt(j));
j++;
}
// 检查货币单位是否在 map 中
if (exchange.containsKey(unit.toString())) {
result += num * exchange.get(unit.toString());
} else {
System.err.println("Error: Unknown currency unit: " + unit);
return 0; // 遇到未知货币单位时可以处理错误
}
}
return result;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
scanner.nextLine(); // 读取换行符
Map<String, Double> exchange = new HashMap<>();
init(exchange);
for (int i = 0; i < n; i++) {
String line = scanner.nextLine();
double result = processInput(line, exchange);
System.out.println((int) result); // 输出时强制转换为整型
}
scanner.close();
}
}
使用
HashMap
代替unordered_map
:在 Java 中,HashMap
提供与unordered_map
类似的功能,效率也较高。字符串处理:Java 使用
StringBuilder
来构建字符串,适合在循环中逐个添加字符的场景。输入处理:使用
Scanner
类处理输入数据,通过nextLine()
和nextInt()
来读取输入。静态常量:Java 中用
static final
来定义常量,并用全大写字母表示常量名。错误处理:用
System.err.println()
输出错误消息,并在遇到未知货币单位时返回0
。
Python
def init_exchange():
# 初始化汇率字典
exchange = {
"fen": 1.0,
"CNY": 100.0,
"JPY": (100.0 / 1825.0) * 100,
"sen": (100.0 / 1825.0),
"HKD": (100.0 / 123.0) * 100,
"cents": (100.0 / 123.0),
"EUR": (100.0 / 14.0) * 100,
"eurocents": (100.0 / 14.0),
"GBP": (100.0 / 12.0) * 100,
"pence": (100.0 / 12.0)
}
return exchange
def process_input(line, exchange):
length = len(line)
result = 0
i = 0
while i < length:
num = 0
unit = ""
# 解析数字部分
while i < length and line[i].isdigit():
num = num * 10 + int(line[i])
i += 1
# 解析货币单位部分
while i < length and line[i].isalpha():
unit += line[i]
i += 1
# 检查货币单位是否在字典中
if unit in exchange:
result += num * exchange[unit]
else:
print(f"Error: Unknown currency unit: {unit}")
return 0 # 遇到未知货币单位时可以处理错误
return result
def main():
# 输入记录数
n = int(input())
# 初始化汇率
exchange = init_exchange()
# 处理每条记录
for _ in range(n):
line = input()
result = process_input(line, exchange)
print(int(result)) # 输出时转换为整型
if __name__ == "__main__":
main()
init_exchange()
:这个函数初始化一个字典,存储不同货币单位到人民币分的汇率。
process_input()
:这个函数处理输入的每一行,将数字和货币单位解析出来,并根据字典中的汇率进行计算。最后返回总计的转换结果。如果遇到未识别的货币单位,会输出错误并返回 0。
main()
:主函数,先从输入中获取要处理的记录数n
,然后读取每条记录并进行处理,最后输出结果。
C++
#include <cctype> // for isdigit, isalpha
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
// 使用 constexpr 定义常量以提高效率和可读性
constexpr double JPY_RATE = 1825.0;
constexpr double HKD_RATE = 123.0;
constexpr double EUR_RATE = 14.0;
constexpr double GBP_RATE = 12.0;
void init(unordered_map<string, double>& exchange)
{
// 存储每种货币相对于 fen 的汇率
exchange["fen"] = 1.0;
exchange["CNY"] = 100.0;
exchange["JPY"] = (100.0 / JPY_RATE) * 100;
exchange["sen"] = (100.0 / JPY_RATE);
exchange["HKD"] = (100.0 / HKD_RATE) * 100;
exchange["cents"] = (100.0 / HKD_RATE);
exchange["EUR"] = (100.0 / EUR_RATE) * 100;
exchange["eurocents"] = (100.0 / EUR_RATE);
exchange["GBP"] = (100.0 / GBP_RATE) * 100;
exchange["pence"] = (100.0 / GBP_RATE);
}
double process_input(const string& line, const unordered_map<string, double>& exchange)
{
int len = line.size();
double result = 0;
for (int j = 0; j < len;) {
int num = 0;
string unit;
// 解析数字部分
while (j < len && isdigit(line[j])) {
num = num * 10 + (line[j] - '0');
j++;
}
// 解析货币单位部分
while (j < len && isalpha(line[j])) {
unit += line[j];
j++;
}
// 检查货币单位是否在 map 中
if (exchange.find(unit) != exchange.end()) {
result += num * exchange.at(unit);
} else {
cerr << "Error: Unknown currency unit: " << unit << endl;
return 0; // 遇到未知货币单位时可以处理错误
}
}
return result;
}
int main()
{
int n;
cin >> n;
unordered_map<string, double> exchange;
init(exchange);
for (int i = 0; i < n; ++i) {
string line;
cin >> line;
double result = process_input(line, exchange);
cout << static_cast<int>(result) << endl; // 输出时强制转换为整型
}
return 0;
}
整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏