一、题目描述
已知火星人使用的运算符为#、$,其与地球人的等价公式如下:
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
四、Java算法源码
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机试2023(Java)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。