华为OD机试真题 - 火星文计算 (D卷,100分)
题目描述
已知火星人使用的运算符为#、$,其与地球人的等价公式如下:
x#y = 2*x+3*y+4
x$y = 3*x+y+2
- 其中x、y是无符号整数
- 地球人公式按C语言规则计算
- 火星人公式中,$的优先级高于#,相同的运算符,按从左到右的顺序计算
现有一段火星人的字符串报文,请你来翻译并计算结果。
输入描述
火星人字符串表达式(结尾不带回车换行)
输入的字符串说明:字符串为仅由无符号整数和操作符(#、$)组成的计算表达式。
例如:123#4$5#67$78。
- 用例保证字符串中,操作数与操作符之间没有任何分隔符。
- 用例保证操作数取值范围为32位无符号整数。
- 保证输入以及计算结果不会出现整型溢出。
- 保证输入的字符串为合法的求值报文,例如:123#4$5#67$78
- 保证不会出现非法的求值报文,例如类似这样字符串:
#4$5 //缺少操作数
4$5# //缺少操作数
4#$5 //缺少操作数
4 $5 //有空格
3+4-5*6/7 //有其它操作符
12345678987654321$54321 //32位整数计算溢出
输出描述
根据输入的火星人字符串输出计算结果(结尾不带回车换行)。
用例
题目解析
- 首先,我们需要将火星人字符串表达式转换为地球人可以识别的表达式。根据题目描述,我们可以将火星人公式中的#替换为C语言中的加法运算符+,将$替换为乘法运算符*。
- 然后,我们需要计算转换后的地球人表达式的值。由于火星人公式中$的优先级高于#,相同的运算符按从左到右的顺序计算,我们可以使用栈来实现这个计算过程。
- 遍历转换后的地球人表达式,对于每个字符:如果是数字,将其压入栈中;如果是运算符,从栈中弹出两个数字进行计算,并将结果压回栈中;如果是$,直接将其作为运算符处理。
- 最后,栈中剩余的数字即为最终结果。
具体实现步骤如下:
- 定义一个函数mars_to_earth(expression),输入参数为火星人字符串表达式,返回值为转换后的地球人表达式。
- 在mars_to_earth函数中,遍历火星人字符串表达式,将#替换为+,将$替换为*,得到转换后的地球人表达式。
- 定义一个函数calculate(expression),输入参数为地球人表达式,返回值为计算结果。
- 在calculate函数中,使用栈来计算地球人表达式的值。
- 调用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卷题目一样。多种语言解法,欢迎提供更好的解法。