20天拿下华为OD笔试之【模拟】2025C-货币兑换【Py/Java/C++/C/JS/Go六种语言OD独家2025C卷真题】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
可上 欧弟OJ系统 练习华子OD、大厂真题
绿色聊天软件戳od1441了解算法冲刺训练(备注【CSDN】否则不通过)
文章目录
相关推荐阅读
- 【华为OD机考】2025C+2025B+2024E+D卷真题【完全原创题解 | 详细考点分类 | 不断更新题目】
- 【华为OD笔试】2025C+2025B+2024E+D卷真题机考套题汇总【真实反馈,不断更新,限时免费】
- 【华为OD笔试】2024E+D卷命题规律解读【分析500+场OD笔试考点总结】
- 【华为OD流程】性格测试选项+注意事项】
题目练习网址:https://www.algomooc.com/problem/P2546
视频直播讲解:
题目描述与示例
题目描述
记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。
每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。
要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃。
元和分的换算关系都是1:100,如下:
- 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
| CNY | JPY | HKD | EUR | GBP |
|---|---|---|---|---|
| 100 | 1825 | 123 | 14 | 12 |
输入描述
第一行输入为N,N表示记录数。0<N<100
之后N行,每行表示一条货币记录,且该行只会是一种货币。
输出描述
将每行货币转换成人民币分(fen)后汇总求和,只保留整数部分。
输出格式只有整数数字,不带小数,不带单位。
示例一
输入
1
100CNY
输出
10000
说明
100`CNY转换后是`10000`fen,所以输出结果为`10000
示例二
输入
1
3000fen
输出
3000
说明
3000`fen,结果就是`3000
示例三
输入
1
123HKD
输出
10000
说明
HKD与CNY的汇率关系是123:100,所以换算后,输出结果为10000
示例四
输入
2
20CNY53fen
53HKD87cents
输出
6432
说明
20`元`53`分 + `53`港元`87`港分,换算成人民币分后汇总,为`6432
解题思路
本题难度不高,属于一个非常基础的模拟类型题目。
首先我们需要根据题意构建一个非常长的exchange()函数,用于根据汇率进行货币单位的换算。
在Python中得使用
if-elif语句,但在Java、C++等语言中,使用switch语句更加符合代码规范。
在exchange()函数中,我们仅需传入一个单位字符串unit,直接返回在该单位下和人民币分fen的汇率。
要特别注意,因为可能出现除不尽的情况,所以要使用浮点数来进行计算而非整数。
# 根据货币单位返回其转换为人民币分的汇率
# 注意每一个分支中,返回的都是浮点数
def exchange(unit):
if unit == "CNY":
return 100.0 # 人民币元
elif unit == "JPY":
return 100.0 / 1825 * 100 # 日元
elif unit == "HKD":
return 100.0 / 123 * 100 # 港元
elif unit == "EUR":
return 100.0 / 14 * 100 # 欧元
elif unit == "GBP":
return 100.0 / 12 * 100 # 英镑
elif unit == "fen":
return 1.0 # 人民币分
elif unit == "cents":
return 100.0 / 123 # 港元分
elif unit == "sen":
return 100.0 / 1825 # 日元分
elif unit == "eurocents":
return 100.0 / 14 # 欧元分
elif unit == "pence":
return 100.0 / 12 # 英镑分
else:
return 0.0 # 无效单位返回0
另一个需要解决的问题就是对每一条货币记录s进行字符串处理。
每一个字符串都可能含有1或2个货币单位,而货币单位前面可能包含若干数字。
我们可以从头到尾遍历字符串,分别用两个变量num和unit来记录遍历中出现的数字和单位。
# 遍历s中的所有字符ch和它们的索引i
for i, ch in enumerate(s):
# 如果ch是数字,则更新num
if ch.isdigit():
num = num*10 + int(ch)
# 如果ch不是数字,则更新单位字符串unit
else:
unit += ch
除此之外,当我们获得一个完整的单位字符串的时候,我们需要进行汇率换算,调用exchange()函数。当
- 当前索引
i是s的最后一个索引,ch是s的最后一个字符的时候 - 当前字符
s[i] = ch是字母,下一个字符s[i+1]是数字的时候
我们确定获得了一个完整的单位字符串。
此时进行汇率换算,并且需要将unit和num进行重置。即
# 输入当前货币字符串
s = input()
# 初始化数字num和单位字符串unit
num = 0
unit = ""
# 遍历s中的所有字符ch和它们的索引i
for i, ch in enumerate(s):
# 如果ch是数字,则更新num
if ch.isdigit():
num = num*10 + int(ch)
# 如果ch不是数字,则更新单位字符串unit
else:
unit += ch
# 如果i是最后一个索引,或者下一个位置是一个数字
# 说明unit字符串已经取完了
if i == len(s)-1 or s[i+1].isdigit():
# 调用exchange()函数进行单位换算,乘上num之后得到用fen来表示的该条货币
# 更新ans
ans += exchange(unit) * num
# 重置num和unit
num = 0
unit = ""
还有一个微小的地方需要注意,题目要求最终要输出的结果只保留整数部分,因此需要取整后输出。
# 最终输出的答案需要保留整数部分,取int
print(int(ans))
题目基本就解决了。
代码
Python
# 欢迎来到「欧弟算法 - 华为OD全攻略」,收录华为OD题库、面试指南、八股文与学员案例!
# 地址:https://www.odalgo.com
# 华为OD机试刷题网站:https://www.algomooc.com
# 添加微信 278166530 获取华为 OD 笔试真题题库和视频
# 题目:【模拟】2024E/2025B/2025C-货币兑换
# 分值:100
# 作者:许老师-闭着眼睛学数理化
# 算法:模拟
# 代码看不懂的地方,请直接在群上提问
# 根据货币单位返回其转换为人民币分的汇率
# 注意每一个分支中,返回的都是浮点数
def exchange(unit):
if unit == "CNY":
return 100.0 # 人民币
elif unit == "JPY":
return 100.0 / 1825 * 100 # 日元
elif unit == "HKD":
return 100.0 / 123 * 100 # 港元
elif unit == "EUR":
return 100.0 / 14 * 100 # 欧元
elif unit == "GBP":
return 100.0 / 12 * 100 # 英镑
elif unit == "fen":
return 1.0 # 人民币分
elif unit == "cents":
return 100.0 / 123 # 港元分
elif unit == "sen":
return 100.0 / 1825 # 日元分
elif unit == "eurocents":
return 100.0 / 14 # 欧元分
elif unit == "pence":
return 100.0 / 12 # 英镑分
else:
return 0.0 # 无效单位返回0
# 输入货币条数
n = int(input())
# 初始化答案,注意这里使用的是浮点数
ans = 0.0
# 循环n次
for _ in range(n):
# 输入当前货币字符串
s = input()
# 初始化数字num和单位字符串unit
num = 0
unit = ""
# 遍历s中的所有字符ch和它们的索引i
for i, ch in enumerate(s):
# 如果ch是数字,则更新num
if ch.isdigit():
num = num*10 + int(ch)
# 如果ch不是数字,则更新单位字符串unit
else:
unit += ch
# 如果i是最后一个索引,或者下一个位置是一个数字
# 说明unit字符串已经取完了
if i == len(s)-1 or s[i+1].isdigit():
# 调用exchange()函数进行单位换算,乘上num之后得到用fen来表示的该条货币
# 更新ans
ans += exchange(unit) * num
# 重置num和unit
num = 0
unit = ""
# 最终输出的答案需要保留整数部分,取int
print(int(ans))
Java
import java.util.Scanner;
public class Main {
// 根据货币单位返回其转换为人民币分的汇率
public static double exchange(String unit) {
switch (unit) {
case "CNY":
return 100.0; // 人民币
case "JPY":
return 100.0 / 1825 * 100; // 日元
case "HKD":
return 100.0 / 123 * 100; // 港元
case "EUR":
return 100.0 / 14 * 100; // 欧元
case "GBP":
return 100.0 / 12 * 100; // 英镑
case "fen":
return 1.0; // 人民币分
case "cents":
return 100.0 / 123; // 港元分
case "sen":
return 100.0 / 1825; // 日元分
case "eurocents":
return 100.0 / 14; // 欧元分
case "pence":
return 100.0 / 12; // 英镑分
default:
return 0.0; // 无效单位
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
double ans = 0.0;
scanner.nextLine(); // 消费掉换行符
// 循环n次
for (int i = 0; i < n; i++) {
String s = scanner.nextLine();
int num = 0;
StringBuilder unit = new StringBuilder();
// 遍历字符串
for (int j = 0; j < s.length(); j++) {
char ch = s.charAt(j);
// 如果是数字,更新num
if (Character.isDigit(ch)) {
num = num * 10 + (ch - '0');
} else {
// 如果不是数字,更新单位
unit.append(ch);
// 如果是最后一个字符或下一个字符是数字
if (j == s.length() - 1 || Character.isDigit(s.charAt(j + 1))) {
ans += exchange(unit.toString()) * num;
num = 0; // 重置数字
unit.setLength(0); // 重置unit
}
}
}
}
System.out.println((int) ans);
}
}
C++
#include <iostream>
#include <string>
using namespace std;
// 根据货币单位返回其转换为人民币分的汇率
double exchange(string unit) {
if (unit == "CNY") return 100.0; // 人民币
if (unit == "JPY") return 100.0 / 1825 * 100; // 日元
if (unit == "HKD") return 100.0 / 123 * 100; // 港元
if (unit == "EUR") return 100.0 / 14 * 100; // 欧元
if (unit == "GBP") return 100.0 / 12 * 100; // 英镑
if (unit == "fen") return 1.0; // 人民币分
if (unit == "cents") return 100.0 / 123; // 港元分
if (unit == "sen") return 100.0 / 1825; // 日元分
if (unit == "eurocents") return 100.0 / 14; // 欧元分
if (unit == "pence") return 100.0 / 12; // 英镑分
return 0.0; // 无效单位
}
int main() {
int n;
cin >> n;
double ans = 0.0;
cin.ignore(); // 消费掉换行符
// 循环n次
for (int i = 0; i < n; i++) {
string s;
getline(cin, s);
long num = 0;
string unit;
// 遍历字符串
for (size_t j = 0; j < s.length(); j++) {
char ch = s[j];
// 如果是数字,更新num
if (isdigit(ch)) {
num = num * 10 + (ch - '0');
} else {
// 如果不是数字,更新单位
unit += ch;
// 如果是最后一个字符或下一个字符是数字
if (j == s.length() - 1 || isdigit(s[j + 1])) {
ans += exchange(unit) * num;
num = 0; // 重置数字
unit.clear(); // 重置unit
}
}
}
}
cout << static_cast<long>(ans) << endl;
return 0;
}
C
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 根据货币单位返回其转换为人民币分的汇率
double exchange(const char* unit) {
if (strcmp(unit, "CNY") == 0) return 100.0; // 人民币
if (strcmp(unit, "JPY") == 0) return 100.0 / 1825 * 100; // 日元
if (strcmp(unit, "HKD") == 0) return 100.0 / 123 * 100; // 港元
if (strcmp(unit, "EUR") == 0) return 100.0 / 14 * 100; // 欧元
if (strcmp(unit, "GBP") == 0) return 100.0 / 12 * 100; // 英镑
if (strcmp(unit, "fen") == 0) return 1.0; // 人民币分
if (strcmp(unit, "cents") == 0) return 100.0 / 123; // 港元分
if (strcmp(unit, "sen") == 0) return 100.0 / 1825; // 日元分
if (strcmp(unit, "eurocents") == 0) return 100.0 / 14; // 欧元分
if (strcmp(unit, "pence") == 0) return 100.0 / 12; // 英镑分
return 0.0; // 无效单位
}
int main() {
int n;
// 输入货币条数
scanf("%d", &n);
double ans = 0.0; // 初始化答案
getchar(); // 消费掉换行符
// 循环n次
for (int i = 0; i < n; i++) {
char s[100]; // 存储货币字符串
fgets(s, sizeof(s), stdin); // 输入当前货币字符串
// 去除换行符
s[strcspn(s, "\n")] = 0;
int num = 0; // 当前数字
char unit[20]; // 当前单位
int unitIndex = 0; // unit字符串的索引
// 遍历字符串中的字符
for (int j = 0; s[j] != '\0'; j++) {
char ch = s[j];
// 如果是数字,更新num
if (isdigit(ch)) {
num = num * 10 + (ch - '0');
} else {
// 如果不是数字,更新unit
unit[unitIndex++] = ch;
// 如果是最后一个字符或下一个字符是数字
if (s[j + 1] == '\0' || isdigit(s[j + 1])) {
unit[unitIndex] = '\0'; // 结束unit字符串
ans += exchange(unit) * num; // 调用exchange()函数进行单位换算,更新ans
num = 0; // 重置数字
unitIndex = 0; // 重置unit
}
}
}
}
// 输出结果,保留整数部分
printf("%d\n", (int)ans); // 输出转换后的人民币分数,取整数部分
return 0;
}
Node JavaScript
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// 根据货币单位返回其转换为人民币分的汇率
function exchange(unit) {
if (unit === "CNY") return 100.0; // 人民币
if (unit === "JPY") return 100.0 / 1825 * 100; // 日元
if (unit === "HKD") return 100.0 / 123 * 100; // 港元
if (unit === "EUR") return 100.0 / 14 * 100; // 欧元
if (unit === "GBP") return 100.0 / 12 * 100; // 英镑
if (unit === "fen") return 1.0; // 人民币分
if (unit === "cents") return 100.0 / 123; // 港元分
if (unit === "sen") return 100.0 / 1825; // 日元分
if (unit === "eurocents") return 100.0 / 14; // 欧元分
if (unit === "pence") return 100.0 / 12; // 英镑分
return 0.0; // 无效单位
}
let ans = 0.0; // 初始化答案
let n = 0; // 货币条数
// 读取输入并处理
rl.question('', (input) => {
n = parseInt(input); // 货币条数
let count = 0;
// 处理每一条货币信息
const processLine = () => {
if (count === n) {
// 输出结果,保留整数部分
console.log(Math.floor(ans)); // 输出转换后的人民币分数,取整数部分
rl.close();
return;
}
rl.question('', (s) => {
let num = 0; // 当前数字
let unit = ""; // 当前单位
// 遍历字符串中的字符
for (let j = 0; j < s.length; j++) {
const ch = s[j];
// 如果是数字,更新num
if (/\d/.test(ch)) {
num = num * 10 + parseInt(ch, 10);
} else {
// 如果不是数字,更新unit
unit += ch;
// 如果是最后一个字符或下一个字符是数字
if (j === s.length - 1 || /\d/.test(s[j + 1])) {
ans += exchange(unit) * num; // 调用exchange()函数进行单位换算,更新ans
num = 0; // 重置数字
unit = ""; // 重置unit
}
}
}
count++;
processLine(); // 继续处理下一行输入
});
};
processLine(); // 开始处理
});
Go
package main
import (
"fmt"
"unicode"
)
// 根据货币单位返回其转换为人民币分的汇率
func exchange(unit string) float64 {
switch unit {
case "CNY":
return 100.0 // 人民币
case "JPY":
return 100.0 / 1825 * 100 // 日元
case "HKD":
return 100.0 / 123 * 100 // 港元
case "EUR":
return 100.0 / 14 * 100 // 欧元
case "GBP":
return 100.0 / 12 * 100 // 英镑
case "fen":
return 1.0 // 人民币分
case "cents":
return 100.0 / 123 // 港元分
case "sen":
return 100.0 / 1825 // 日元分
case "eurocents":
return 100.0 / 14 // 欧元分
case "pence":
return 100.0 / 12 // 英镑分
default:
return 0.0 // 无效单位
}
}
func main() {
var n int
// 输入货币条数
fmt.Scan(&n)
var ans float64 = 0.0 // 初始化答案
// 循环n次
for i := 0; i < n; i++ {
var s string
// 输入当前货币字符串
fmt.Scan(&s)
num := 0 // 当前数字
unit := "" // 当前单位
// 遍历字符串中的字符
for j := 0; j < len(s); j++ {
ch := s[j]
// 如果是数字,更新num
if unicode.IsDigit(rune(ch)) {
num = num*10 + int(ch-'0')
} else {
// 如果不是数字,更新unit
unit += string(ch)
// 如果是最后一个字符或下一个字符是数字
if j == len(s)-1 || unicode.IsDigit(rune(s[j+1])) {
ans += exchange(unit) * float64(num) // 调用exchange()函数进行单位换算,更新ans
num = 0 // 重置数字
unit = "" // 重置unit
}
}
}
}
// 输出结果,保留整数部分
fmt.Println(int(ans)) // 输出转换后的人民币分数,取整数部分
}
时空复杂度
时间复杂度:O(NM)。N是货币条数,M是每个字符串的平均长度。
空间复杂度:O(1)。
华为OD算法/大厂面试高频题算法练习冲刺训练
-
华子OD算法/大厂面试高频题算法冲刺训练目前开始常态化报名!目前已服务1000+同学成功上岸!
-
课程讲师为全网200w+粉丝编程博主@吴师兄学算法 以及小红书头部编程博主@闭着眼睛学数理化
-
90+天陪伴式学习,100+直播课时,300+动画图解视频,500+LeetCode经典题,500+华为OD真题/大厂真题,还有简历修改、模拟面试、陪伴小群、资深HR对接将为你解锁
-
可上全网独家的欧弟OJ系统练习华子OD、大厂真题
-
可查看链接OD真题汇总(持续更新)
-
绿色聊天软件戳
od1441或了解更多
更多推荐
所有评论(0)