Leecode_1006-笨阶层, 本来觉得这道题10分钟应该能ac,结果花了1个多小时,还是不够严谨仔细。 笨阶层 - 图1思路很简单,用栈保存每次乘除法运算的结果,碰到加减直接把操作数入栈,最后统一算。然后出栈的数字是表达式右边的数字,因为存在减法,所以我们要从前面开始算,也就是对栈做一个逆序然后先加再减。这样其实绕了一个弯,如果全是加法的话,从前往后算还是从后往前算都是一样的。所以我们碰到减法操作时入栈的时候保存负数即可。

    1. import javax.jws.soap.SOAPBinding;
    2. import java.util.*;
    3. public class Main {
    4. public static void main(String[] args) {
    5. System.out.println(clumsy(1));
    6. }
    7. public static int clumsy(int N) {
    8. int count = 1;
    9. Stack<Integer> operand = new Stack<>();
    10. // 操作数
    11. int i = N - 1;
    12. operand.push(N);
    13. while(i > 0) {
    14. if(count % 4 == 1) {
    15. operand.push(operand.pop() * i);
    16. }
    17. else if(count % 4 == 2) {
    18. operand.push(operand.pop() / i);
    19. }
    20. else {
    21. operand.push(i);
    22. }
    23. //else {
    24. // operand.push(-i);
    25. //}
    26. i = i - 1;
    27. count++;
    28. }
    29. int m = operand.size();
    30. int[] sum = new int[m];
    31. //扭转栈,如果直接出栈就是从表达式后面算起,碰到减法会有问题,应该从前面开始算。
    32. while(!operand.isEmpty()){
    33. sum[--m] = operand.pop();
    34. }
    35. int result = sum[0];
    36. int flag = 0;
    37. for(int j = 1; j < sum.length; j++) {
    38. System.out.println(sum[j]);
    39. if(flag % 2 == 0)
    40. result = result + sum[j];
    41. else
    42. result = result - sum[j];
    43. flag++;
    44. }
    45. return result;
    46. }
    47. }