682. Baseball Game

来源:互联网 发布:淘宝店铺里的图片变形 编辑:程序博客网 时间:2024/04/30 04:13

问题描述:给你一个字符串数组,其中包含:数字、C、D、+、四种字符。数字表明你这一局得分,C表明你上一局得分无效,D表明你这句得分是上一局得分两倍,+表明你这一局得分是前两次有效得分之和。C不是有效得分并且会移除一次有效得分。
思路:原打算用两个指针分别记录上一局和上上局得分。但发现遇上连续多个C时,无法追溯之前的得分。题目上的标签为stack。C、D操作确实很像stack。但是+需要pop两次再push进去。再三考虑下,干脆用同样长的int数组记录每局得分,然后再累加好了。
原答案:

    public int calPoints(String[] ops) {        int length=ops.length;        int [] result=new int[length];        int j=-1;        String s="";        int totalSum=0;        for(int i=0;i<length;i++){            s=ops[i];            if("C".equals(s)){                result[j]=0;                j=j-1;            }else if("D".equals(s)){                result[j+1]=result[j]*2;                j=j+1;            }else if("+".equals(s)){                result[j+1]=result[j]+result[j-1];                j=j+1;            }else{                result[j+1]=toNum(s);                j=j+1;            }        }        for(int i=0;i<length;i++){            totalSum=totalSum+result[i];        }        return totalSum;    }    private int toNum(String s){        return Integer.valueOf(s);    }

最佳答案:

    public int calPoints(String[] ops) {        int sum = 0;        int[] valid = new int[ops.length];        int v = -1;        for(int i = 0; i < ops.length; i++){            if(ops[i].equals("C")){                sum -= valid[v];                v--;            } else if(ops[i].equals("D")){                int d = valid[v] + valid[v];                v++;                valid[v] = d;                sum += d;            } else if(ops[i].equals("+")){                int p = valid[v] + valid[v - 1];                v++;                valid[v] = p;                sum += p;            } else {                int val = Integer.parseInt(ops[i]);                v++;                valid[v] = val;                sum += val;            }        }        return sum;    }

整体思路基本一致,使用了另一个数组记录得分。不同的是,得分在第一次遍历的时候就能计算出来了,不用再遍历一次了

原创粉丝点击