火星文计算——没验证过不确定对不对

■ 题目描述

【火星文计算】

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

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 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

7#6$5#12

输出

226

说明

示例

7#6$5#12

=7#(3*6+5+2)#12

=7#25#12

=(2*7+3*25+4)#12

=93#12

=2*93+3*12+4

=226
package OD真题.火星文计算;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    // eg:  7#6$5#12
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        scanner.close();

        // 将字符串转化为字符数组(转化后的数字都是单个的,比如 12 会转化为 1, 2)
        // [7, #, 6, $, 5, #, 1, 2]
        char[] chars = s.toCharArray();
        // 用于数字合并(将 1, 2 转化为 12)
        String num = "";
        // 用于接收 便于使用的 表达试的List(数字是一位, 字符是一位)
        ArrayList<String> numList = new ArrayList<>();
        // 遍历字符数组
        for (char c : chars) {
            // 如果此字符是数字就加到合并数组的字符串
            if (Character.isDigit(c)) {
                num = num + c;
            } else {
                // 如果遇到 操作符 将数字加入 List
                numList.add(num);
                // 将操作符也加入list
                numList.add(String.valueOf(c));
                // 置空字符串,用于下次组合数字
                num = "";
            }
        }
        // 最后一位数字 后面是没有 字符的, 故需要把最后一个数字加入 List
        numList.add(num);

        // 遍历组合好的 表达式List(先处理优先的操作)
        // 转化好的 : numList : [7, #, 6, $, 5, #, 12]
        for (int i = 0; i < numList.size(); i++) {
            // 遇到需要转化的操作符
            if (numList.get(i).equals("$")) {
                // 转化为对应的数学表达式
                int temp = 3 * Integer.parseInt(numList.get(i-1)) + Integer.parseInt(numList.get(i+1)) + 2;
                // 将结果 加到转化的表达式的前面
                numList.add(i-1, Integer.toString(temp));
                // 移除原来的表达式
                numList.remove(i);
                numList.remove(i);
                numList.remove(i);
                // 移除后坐标会发生变化,故需要从头遍历
                i = 0;
            }
        }

        // [7, #, 25, #, 12]
        for (int i = 0; i < numList.size(); i++) {
            if (numList.get(i).equals("#")) {
                int temp = 2 * Integer.parseInt(numList.get(i-1)) + 3 * Integer.parseInt(numList.get(i+1)) + 4;
                // [93, 7, #, 25, #, 12]
                numList.add(i-1, Integer.toString(temp));
                // [93, #, 25, #, 12]
                numList.remove(i);
                // [93, 25, #, 12]
                numList.remove(i);
                // [93, #, 12]
                numList.remove(i);
                // 此时 i = 1, 再次循环时,i = 2,就无法再遍历到字符 进行转化操作了
                // 故需要 将 i 变成 0 ,从头遍历
                i = 0;
            }
        }

        System.out.println(Arrays.toString(numList.toArray()));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值