滴滴的算式翻转题
首先,只有两种操作符存在可以交换操作数的情况:+ 和 *,思路就是把连续的*所连接的操作数进行排序,把连续的+所连接的操作数进行排序。
但+ 有一个受限条件:连续的加号被非减号的操作符(*和/)断开,需要少排序一个数,比如 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%,就不冤了😂
查看18道真题和解析
