可上 欧弟OJ系统 练习华子OD、大厂真题
绿色聊天软件戳 od1441了解算法冲刺训练(备注【CSDN】否则不通过)

相关推荐阅读

题目练习网址:https://www.algomooc.com/problem/P2546

视频直播讲解:

2024/09/28 真题讲解(2024E卷)

2025/05/23 真题讲解(2025B卷模拟类型题目)

题目描述与示例

题目描述

记账本上记录了若干条多国货币金额,需要转换成人民币分(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

输入描述

第一行输入为NN表示记录数。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进行字符串处理。

每一个字符串都可能含有12个货币单位,而货币单位前面可能包含若干数字。

我们可以从头到尾遍历字符串,分别用两个变量numunit来记录遍历中出现的数字和单位。

# 遍历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()函数。当

  • 当前索引is的最后一个索引,chs的最后一个字符的时候
  • 当前字符s[i] = ch是字母,下一个字符s[i+1]是数字的时候

我们确定获得了一个完整的单位字符串。

此时进行汇率换算,并且需要将unitnum进行重置。即

# 输入当前货币字符串
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或了解更多

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐