一、题目描述
已知火星人使用的运算符为#、$,其与地球人的等价公式如下:
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 //有其它操作符
- 1234567898765
- 4321$54321 //32位整数计算溢出
三、输出描述
根据输入的火星人字符串输出计算结果(结尾不带回车换行)。
输入
7#6$5#12
输出
226
示例说明:
7#6$5#12
=7#(36+5+2)#12
=7#25#12
=(27+325+4)#12
=93#12
=293+3*12+4
=226
四、解题思路
题目要求根据火星人的字符串表达式进行计算,其中火星人的运算符为#和$,与地球人的等价公式如下:
x#y = 2*x+3*y+4
x$y = 3*x+y+2
地球人的公式按照C语言规则计算,而火星人的公式中,$的优先级高于#,相同的运算符按照从左到右的顺序计算。
算法流程:
- 读取输入的火星人字符串表达式;
- 定义一个递归函数get(String n),用于计算火星人表达式的值;
- 在get函数中,首先判断字符串中是否存在#运算符,如果存在,则将字符串分为左右两部分,分别进行递归计算,然后按照公式2 * get(left) + 3 * get(right) + 4进行计算,返回结果;
- 如果字符串中不存在#运算符,则判断是否存在$运算符,如果存在,则按照公式3 * get(left) + get(right) + 2进行计算,返回结果;
- 如果字符串中既不存在#运算符也不存在$运算符,则将字符串转换为整数并返回;
- 在主函数中,使用get函数计算火星人字符串表达式的值,并输出结果。
五、JavaScript算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String n = sc.nextLine();
System.out.println(get(n));
}
sc.close();
}
private static int get(String n) {
int i = n.lastIndexOf("#");
if (i != -1) {
String left = n.substring(0, i);
String right = n.substring(i + 1);
return 2 * get(left) + 3 * get(right) + 4;
}
i = n.lastIndexOf("$");
if (i != -1) {
String left = n.substring(0, i);
String right = n.substring(i + 1);
return 3 * get(left) + get(right) + 2;
}
return Integer.parseInt(n);
}
六、效果展示
🏆下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。