货币单位换算 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。

每行记录一条金额,金额带有货币单位,格式为数字+单位,可能是单独元,或者单独分,或者元与分的组合。

要求将这些货币全部换算成人民币分(fen)后进行汇总,汇总结果仅保留整数,小数部分舍弃。

元和分的换算关系都是1:100,如下:

  • 1CNY=100fen(1元=100分)
  • 1HKD=100cents(1港元=100港分)
  • 1JPY=100sen(1日元=100仙)
  • 1EUR=100eurocents(1欧元=100欧分)
  • 1GBP=100pence(1英镑=100便士)

汇率如下表

CNY JPY HKD EUR GBP
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),然后进行汇总。它可以归为 字符串处理数学计算 类问题。

解题思路

  1. 解析输入:对于每一行输入的货币记录,我们首先需要从字符串中提取出金额和货币单位。货币单位可能是元(CNY、JPY等)或者分(fen、cents等),因此需要精确提取。
  2. 建立汇率表:使用哈希映射 (在不同语言中分别为 mapHashMapdict) 来存储每种货币单位相对于人民币分的换算关系。
  3. 转换为人民币分:根据提取的货币单位,通过汇率表将其转换为人民币分(fen)。
  4. 汇总求和:处理完所有货币记录后,对其进行汇总,只保留整数部分,舍弃小数。
  5. 输出结果:最终结果只需要输出整数形式的总和。

代码大致描述

  1. 初始化汇率表:将所有相关货币的单位转换汇率存入一个哈希映射(例如,"CNY": 100.0"JPY": (100 / 1825.0) * 100)。
  2. 解析字符串:遍历每一行货币记录,提取出货币单位和数值。
  3. 查找汇率并进行转换:利用提取的货币单位从哈希映射中查找对应汇率,并将货币值转换为人民币分。
  4. 结果汇总:将转换后的分值进行累加,输出结果。

时间复杂度

时间复杂度为 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;
}
    

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

全部评论

相关推荐

吴offer选手:HR:我KPI到手了就行,合不合适关我什么事
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务