华为OD机试真题 - 火星文计算 (D卷,100分)

题目描述

已知火星人使用的运算符为#、$,其与地球人的等价公式如下:

x#y = 2*x+3*y+4

x$y = 3*x+y+2

  1. 其中x、y是无符号整数
  2. 地球人公式按C语言规则计算
  3. 火星人公式中,$的优先级高于#,相同的运算符,按从左到右的顺序计算

现有一段火星人的字符串报文,请你来翻译并计算结果。

输入描述

火星人字符串表达式(结尾不带回车换行)

输入的字符串说明:字符串为仅由无符号整数和操作符(#、$)组成的计算表达式。

例如:123#4$5#67$78。

  1. 用例保证字符串中,操作数与操作符之间没有任何分隔符。
  2. 用例保证操作数取值范围为32位无符号整数。
  3. 保证输入以及计算结果不会出现整型溢出。
  4. 保证输入的字符串为合法的求值报文,例如:123#4$5#67$78
  5. 保证不会出现非法的求值报文,例如类似这样字符串:

#4$5 //缺少操作数

4$5# //缺少操作数

4#$5 //缺少操作数

4 $5 //有空格

3+4-5*6/7 //有其它操作符

12345678987654321$54321 //32位整数计算溢出

输出描述

根据输入的火星人字符串输出计算结果(结尾不带回车换行)。

用例

题目解析

  1. 首先,我们需要将火星人字符串表达式转换为地球人可以识别的表达式。根据题目描述,我们可以将火星人公式中的#替换为C语言中的加法运算符+,将$替换为乘法运算符*。
  2. 然后,我们需要计算转换后的地球人表达式的值。由于火星人公式中$的优先级高于#,相同的运算符按从左到右的顺序计算,我们可以使用栈来实现这个计算过程。
  3. 遍历转换后的地球人表达式,对于每个字符:如果是数字,将其压入栈中;如果是运算符,从栈中弹出两个数字进行计算,并将结果压回栈中;如果是$,直接将其作为运算符处理。
  4. 最后,栈中剩余的数字即为最终结果。

具体实现步骤如下:

  1. 定义一个函数mars_to_earth(expression),输入参数为火星人字符串表达式,返回值为转换后的地球人表达式。
  2. 在mars_to_earth函数中,遍历火星人字符串表达式,将#替换为+,将$替换为*,得到转换后的地球人表达式。
  3. 定义一个函数calculate(expression),输入参数为地球人表达式,返回值为计算结果。
  4. 在calculate函数中,使用栈来计算地球人表达式的值。
  5. 调用mars_to_earth函数和calculate函数,输出计算结果。

JavaScript算法源码

const path = require("path");
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on("li

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024华为OD机试题库D卷 文章被收录于专栏

2024年5-11月份考的D卷,不用再看AB卷,CD卷题目一样。多种语言解法,欢迎提供更好的解法。

全部评论
机试350分,十分感谢
点赞
送花
回复 分享
发布于 06-21 12:20 广东

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务