1. 程式人生 > >146、棒球比賽

146、棒球比賽

題目描述
你現在是棒球比賽記錄員。
給定一個字串列表,每個字串可以是以下四種類型之一:
1.整數(一輪的得分):直接表示您在本輪中獲得的積分數。
2. “+”(一輪的得分):表示本輪獲得的得分是前兩輪有效 回合得分的總和。
3. “D”(一輪的得分):表示本輪獲得的得分是前一輪有效 回合得分的兩倍。
4. “C”(一個操作,這不是一個回合的分數):表示您獲得的最後一個有效 回合的分數是無效的,應該被移除。

每一輪的操作都是永久性的,可能會對前一輪和後一輪產生影響。
你需要返回你在所有回合中得分的總和。

示例 1:

輸入: [“5”,“2”,“C”,“D”,"+"]
輸出: 30
解釋:
第1輪:你可以得到5分。總和是:5。
第2輪:你可以得到2分。總和是:7。
操作1:第2輪的資料無效。總和是:5。
第3輪:你可以得到10分(第2輪的資料已被刪除)。總數是:15。
第4輪:你可以得到5 + 10 = 15分。總數是:30。
示例 2:

輸入: [“5”,"-2",“4”,“C”,“D”,“9”,"+","+"]
輸出: 27
解釋:
第1輪:你可以得到5分。總和是:5。
第2輪:你可以得到-2分。總數是:3。
第3輪:你可以得到4分。總和是:7。
操作1:第3輪的資料無效。總數是:3。
第4輪:你可以得到-4分(第三輪的資料已被刪除)。總和是:-1。
第5輪:你可以得到9分。總數是:8。
第6輪:你可以得到-4 + 9 = 5分。總數是13。
第7輪:你可以得到9 + 5 = 14分。總數是27。
注意:

輸入列表的大小將介於1和1000之間。
列表中的每個整數都將介於-30000和30000之間。
用棧來儲存,效率可能不是很高,只大概超過了60%,但是是一次性成功的

class Solution {
    public int calPoints(String[] ops) {
        	//一個計數器計算總的得分,用於最後的返回
		int count = 0;
		//一個計數器用於計算每一輪的,push,pop,peek
		Stack<Integer> tem = new Stack();
		for (int i = 0; i < ops.length; i++) {
			String string = ops[i];
			/*1.整數(一輪的得分):直接表示您在本輪中獲得的積分數。
			2. "+"(一輪的得分):表示本輪獲得的得分是前兩輪有效 回合得分的總和。
			3. "D"(一輪的得分):表示本輪獲得的得分是前一輪有效 回合得分的兩倍。
			4. "C"(一個操作,這不是一個回合的分數):表示您獲得的最後一個有效 回合的分數是無效的,應該被移除。*/
			if(string.equals("C")){
				int fenshu = tem.pop();
				count -= fenshu;
			}else if (string.equals("D")) {
				count += tem.peek()*2;
				tem.push(tem.peek()*2);
			}else if (string.equals("+")) {
				//取出前兩輪的得分
				int yilun = tem.pop();
				int erlun = tem.peek();
				tem.push(yilun);
				int score = yilun + erlun;
				tem.push(score);
				count +=score;
			}else {
				//數字的化就直接轉成數字放入
				int score = Integer.parseInt(string);
				count += score;
				tem.push(score);
			}
			
			
		}
		
		
		return count;
    }
}

改成陣列實現,發現提高到70%

class Solution {
    public int calPoints(String[] ops) {
        	//一個計數器計算總的得分,用於最後的返回
		int count = 0;
		//一個計數器用於計算每一輪的,push,pop,peek
	//	Stack<Integer> tem = new Stack();
		int size = 0;
		int tem [] = new int[1024];
		for (int i = 0; i < ops.length; i++) {
			String string = ops[i];
			/*1.整數(一輪的得分):直接表示您在本輪中獲得的積分數。
			2. "+"(一輪的得分):表示本輪獲得的得分是前兩輪有效 回合得分的總和。
			3. "D"(一輪的得分):表示本輪獲得的得分是前一輪有效 回合得分的兩倍。
			4. "C"(一個操作,這不是一個回合的分數):表示您獲得的最後一個有效 回合的分數是無效的,應該被移除。*/
			if(string.equals("C")){
				//int fenshu = tem.pop();
				int fenshu = tem[size];
				size --;
				count -= fenshu;
			}else if (string.equals("D")) {
				count += tem[size]*2;
				size++;
				tem[size] = tem[size-1] * 2;
			}else if (string.equals("+")) {
				//取出前兩輪的得分
				int yilun = tem[size];
				int erlun = tem[size-1];
				size ++;
				int score = yilun + erlun;
				tem[size] = score;
				count +=score;
			}else {
				//數字的化就直接轉成數字放入
				int score = Integer.parseInt(string);
				count += score;
				size ++;
				
				tem[size] = score;
			}
			
			
		}
		
		
		return count;
    }
}

排名靠前的程式碼,用的是我的那個陣列實現的,不是用棧,初始化時有區別,其餘沒什麼區別

class Solution {
    public int calPoints(String[] ops) {
        int[] stack = new int[ops.length];
        int offset = 0;
        int total = 0;
        for (int i=0;i<ops.length;i++){
            if (ops[i].equals("+")) {
                stack[offset] = stack[offset-1] + stack[offset-2];
                total += stack[offset];
                offset++;
            } else if (ops[i].equals("D")){
                stack[offset] = stack[offset -1] * 2;
                total += stack[offset];
                offset++;
            } else if (ops[i].equals("C")){
                offset--;
                total -= stack[offset];
            } else {
                stack[offset] = Integer.parseInt(ops[i]);
                total += stack[offset];
                offset ++;
            }
        }
        return total;
    }
}