682. 야구 게임: 간단한 시뮬레이션 문제

제안이 도착했습니다. 친구를 찾아 픽업하세요! 2022년 봄학기 채용 체크인 이벤트에 참여하고 있습니다. 자세한 이벤트 내용 을 보려면 클릭 하세요 .

주제 설명

이것은 682입니다. 쉬운 난이도 LeetCode의 야구 게임 .

태그 : "시뮬레이션"

당신은 이제 특별 게임 야구 게임의 득점원입니다. 게임은 여러 라운드로 구성되며 지난 라운드의 점수가 이후 라운드의 점수에 영향을 줄 수 있습니다.

게임이 시작되었을 때 기록은 비어 있었습니다. 작업을 기록하는 문자열 목록이 표시됩니다 ops. 여기서 영형 에스 [ ] 옵스[i] 해야 하는 번호입니다. 작업을ops수행하려면 다음 규칙을 따르십시오.

  1. 정수 x- 이번 라운드에서 얻은 새로운 점수를 나타냅니다.x
  2. "+"- 이번 라운드에서 획득한 새로운 점수가 이전 두 점수의 합임을 나타냅니다. 항목 데이터는 기록될 때 이 작업 앞에 항상 두 개의 유효한 점수가 있음을 보장합니다.
  3. "D"- 이번 라운드에서 획득한 새로운 점수가 이전 점수의 2배임을 나타냅니다. 항목 데이터는 이 작업이 기록되기 전에 항상 유효한 점수가 존재함을 보장합니다.
  4. "C"- 이전 점수가 유효하지 않아 기록에서 제거되었음을 나타냅니다. 항목 데이터는 이 작업이 기록되기 전에 항상 유효한 점수가 존재함을 보장합니다.

기록에 있는 모든 점수의 합계를 반환하십시오.

예 1:

输入:ops = ["5","2","C","D","+"]

输出:30

解释:
"5" - 记录加 5 ,记录现在是 [5]
"2" - 记录加 2 ,记录现在是 [5, 2]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5].
"D" - 记录加 2 * 5 = 10 ,记录现在是 [5, 10].
"+" - 记录加 5 + 10 = 15 ,记录现在是 [5, 10, 15].
所有得分的总和 5 + 10 + 15 = 30
复制代码

예 2:

输入:ops = ["5","-2","4","C","D","9","+","+"]

输出:27

解释:
"5" - 记录加 5 ,记录现在是 [5]
"-2" - 记录加 -2 ,记录现在是 [5, -2]
"4" - 记录加 4 ,记录现在是 [5, -2, 4]
"C" - 使前一次得分的记录无效并将其移除,记录现在是 [5, -2]
"D" - 记录加 2 * -2 = -4 ,记录现在是 [5, -2, -4]
"9" - 记录加 9 ,记录现在是 [5, -2, -4, 9]
"+" - 记录加 -4 + 9 = 5 ,记录现在是 [5, -2, -4, 9, 5]
"+" - 记录加 9 + 5 = 14 ,记录现在是 [5, -2, -4, 9, 5, 14]
所有得分的总和 5 + -2 + -4 + 9 + 5 + 14 = 27
复制代码

예 3:

输入:ops = ["1"]

输出:1
复制代码

힌트:

  • 1 < = 영형 에스 . 이자형 N G 시간 < = 1000 1 <= 작업 길이 <= 1000
  • 영형 에스 [ ] ops[i] "C""D""+",或者一个表示整数的字符串。整数范围是 [ 3 1 0 4 , 3 1 0 4 ] [-3 * 10^4, 3 * 10^4]
  • 对于 "+" 操作,题目数据保证记录此操作时前面总是存在两个有效的分数
  • 对于 "C""D" 操作,题目数据保证记录此操作时前面总是存在一个有效的分数

模拟

根据题意进行模拟即可。

代码:

class Solution {
    static int[] nums = new int[1010];
    public int calPoints(String[] ops) {
        int n = ops.length, idx = 0;
        for (int i = 0; i < n; i++, idx++) {
            if (ops[i].equals("+")) nums[idx] = nums[idx - 1] + nums[idx - 2];    
            else if (ops[i].equals("D")) nums[idx] = nums[idx - 1] * 2;
            else if (ops[i].equals("C")) idx -= 2;
            else nums[idx] = Integer.parseInt(ops[i]);
        }
        int ans = 0;
        for (int i = 0; i < idx; i++) ans += nums[i];
        return ans;
    }
}
复制代码

nums = [0 for _ in range(1010)]
class Solution:
    def calPoints(self, ops: List[str]) -> int:
        idx = 0
        for i in range(len(ops)):
            if ops[i] == '+':
                nums[idx] = nums[idx - 1] + nums[idx - 2]
            elif ops[i] == 'D':
                nums[idx] = nums[idx - 1] * 2
            elif ops[i] == 'C':
                idx -= 2
            else:
                nums[idx] = int(ops[i])
            idx += 1
        return sum(nums[i] for i in range(idx))
复制代码
  • 时间复杂度: O ( n ) O(n)
  • 空间复杂度: O ( n ) O(n)

最后

这是我们「刷穿 LeetCode」系列文章的第 No.682 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。

이 일련의 기사에서는 문제 해결 아이디어를 설명하는 것 외에도 가장 간결한 코드를 최대한 많이 제공합니다. 일반 솔루션이 포함된 경우 해당 코드 템플릿도 제공됩니다.

학생들이 컴퓨터에서 코드를 디버그하고 제출하는 것을 용이하게 하기 위해 관련 저장소를 만들었습니다. github.com/SharingSour… .

창고 주소에서 일련의 기사 솔루션에 대한 링크, 기사 시리즈의 해당 코드, LeetCode의 원래 질문에 대한 링크 및 기타 선호하는 솔루션에 대한 링크를 볼 수 있습니다.

추천

출처juejin.im/post/7079224311206117407