滴滴的算式翻转题
首先,只有两种操作符存在可以交换操作数的情况:+ 和 *,思路就是把连续的*所连接的操作数进行排序,把连续的+所连接的操作数进行排序。
但+ 有一个受限条件:连续的加号被非减号的操作符(*和/)断开,需要少排序一个数,比如 9 + 6 + 3 / 2,只能对9和6进行排序,不能动那个3;
开始编码:
//main函数,处理输入,用空格把输入拆分成字符串数字,调用解题函数并输出结果 public static void main(String[] args) { Scanner in = new Scanner(System.in); int count = in.nextInt(); in.nextLine(); String[] factors = in.nextLine().trim().split(" "); solve(factors); if (factors.length > 0) { System.out.print(factors[0]); for (int i = 1; i < factors.length; i++) { System.out.print(" " + factors[i]); } } System.out.println(" "); } //解题函数,先处理乘号,再处理加号,时间复杂度O(2n) = O(n) //可以优化为只遍历一趟 private static void solve(String[] factors) { solveOperator(factors, "*"); solveOperator(factors, "+"); } //对单个操作符进行处理 private static void solveOperator(String[] factors, String operator) { int index = 0; while (index < factors.length) { //找到第一个对应的操作符 while (index < factors.length && !factors[index].equals(operator)) { index++; } //用来记录和排序操作数 List<Integer> operands = new ArrayList<>(); //向operands列表添加连续的operator所连接的操作数 while (index < factors.length && factors[index].equals(operator)) { operands.add(Integer.parseInt(factors[index - 1])); index += 2; } //index用于遍历,pointer用于对排序后的结果进行回填 int pointer; // + 的受限条件下,少排序一个数字 if (operator.equals("+") && index < factors.length && !factors[index].equals("-")) { pointer = index - 1; } else { operands.add(Integer.parseInt(factors[index - 1])); pointer = index + 1; } //排序 Collections.sort(operands); //将排序后的操作数进行回填 for (int i = 0; i < operands.size(); i++) { factors[pointer - (operands.size() * 2 - i * 2)] = operands.get(i).toString(); } } }
根据下面大家评论发现,少考虑了连减和连除等情况,只过了18%,就不冤了😂