华为机试:火星符号运算

题目描述

已知火星人使用的运算符号为#和$
其与地球人的等价公式如下
x#y=2*x+3*y+4
x$y=3*x+y+2
x y是无符号整数
地球人公式按照c语言规则进行计算
火星人公式中$符优先级高于#相同的运算符按从左到右的顺序运算。

输入描述

火星人字符串表达式结尾不带回车换行
输入的字符串说明是 字符串为仅有无符号整数和操作符组成的计算表达式

1.用例保证字符串中操作数与操作符之间没有任何分隔符
2.用例保证操作数取值范围为32位无符号整数,
3.保证输入以及计算结果不会出现整型溢出
4.保证输入的字符串为合法的求值报文
例如: 123#4$5#76$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。

思路分析

  • 先执行$运算,再执行#运算,同级别的从左往右运算。
  • 输出结果结尾不带回车换行。

参考代码

注:题目网上找的,参考代码是练习用,仅供参考,并不保证用例通过率。

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

/**
 * 题目46 火星符号
 */
public class Test0046 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();

        // 获取所有操作符
        List operators = Arrays.stream(str.split("\\w+"))
                .filter(s -> !s.isEmpty())
                .collect(Collectors.toList());
        List nums = Arrays.stream(str.split("\\W+"))
                .map(Integer::parseInt)
                .collect(Collectors.toList());

        // 先执行优先级高的$运算
        int pos$ = operators.indexOf("$");
        while (pos$ != -1) {
            int temp = dollar(nums.get(pos$), nums.get(pos$ + 1));
            nums.set(pos$, temp);
            nums.remove(pos$ + 1);
            operators.remove(pos$);
            pos$ = operators.indexOf("$");
        }

        // 再执行优先级低的#运算
        int result = nums.get(0);
        for (int j = 1; j < nums.size(); j++) {
            result = sharp(result, nums.get(j));
        }
        System.out.print(result);
    }

    private static int dollar(int x, int y) {
        // $运算
        return 3 * x + y + 2;
    }

    private static int sharp(int x, int y) {
        // #运算
        return 2 * x + 3 * y + 4;
    }
}

你可能感兴趣的:(数据结构与算法,Java机试,java,算法,华为机试,OD)