LeetCode 682: Sistema de Pontuação de Beisebol (C++/Java)

O problema 682 do LeetCode simula um rgeistrador de pontos de um jogo de beisebol. Dada uma lista de strings, cada string pode ser um dos seguintes tipos:

  • Número inteiro: Representa diretamente os pontos ganhos na rodada atual.
  • "+": Os pontos da rodada atual são a soma dos pontos das duas últimas rodadas válidas.
  • "D": Os pontos da rodada atual são o dobro dos pontos da última rodada válida.
  • "C": Remove os pontos da última rodada válida (não conta como rodada pontuada).

Cada operação é permanente e pode afetar as rodadas anteriores e posteriores. O objetivo é retornar a soma total de pontos de todas as rodadas.

Exemplo 1

Entrada: ["5","2","C","D","+"]
Saída: 30
Explicação:
Rodada 1: Recebe 5 pontos. Soma: 5.
Rodada 2: Recebe 2 pontos. Soma: 7.
Operação 1 (C): Remove a rodada 2. Soma: 5.
Rodada 3 (D): O dobro da última válida (5). Soma: 5 + 10 = 15.
Rodada 4 (+): Soma das duas últimas válidas (5 + 10 = 15). Soma: 15 + 15 = 30.

Exemplo 2

Entrada: ["5","-2","4","C","D","9","+","+"]
Saída: 27
Explicação:
Rodada 1: 5 pontos. Soma: 5.
Rodada 2: -2 pontos. Soma: 3.
Rodada 3: 4 pontos. Soma: 7.
Operação 1 (C): Remove rodada 3. Soma: 3.
Rodada 4 (D): Dobro da última válida (-2). Soma: 3 + (-4) = -1.
Rodada 5: 9 pontos. Soma: -1 + 9 = 8.
Rodada 6 (+): Soma das últimas válidas (-4 + 9 = 5). Soma: 8 + 5 = 13.
Rodada 7 (+): Soma das últimas válidas (9 + 5 = 14). Soma: 13 + 14 = 27.

Restrições

  • O tamanho da lista de entrada está entre 1 e 1000.
  • Os números inteiros representados estão entre -30000 e 30000.

Estratégia de Solução

A abordagem mais simples é usar uma estrutura de dados linear (como um vetor ou lista) para armazenar os pontos das rodadas válidas. Percorremos a lista de operações uma vez e aplicamos as regras:

  • Se for um número, adicionamos ao final do vetor.
  • Se for "+", somamos os dois últimos elementos do vetor e adicionamos o resultado.
  • Se for "D", dobramos o último elemento e adicionamos.
  • Se for "C", removemos o último elemento.

Ao final, somamos todos os valores no vetor.

Implementação em C++

class Solution {
public:
    int calPoints(vector<string>& ops) {
        vector<int> pontos;
        for (const string& op : ops) {
            int n = pontos.size();
            if (op == "+") {
                // Soma dos dois últimos pontos válidos
                pontos.push_back(pontos[n-1] + pontos[n-2]);
            } else if (op == "D") {
                // Dobro do último ponto válido
                pontos.push_back(2 * pontos[n-1]);
            } else if (op == "C") {
                // Remove o último ponto válido
                pontos.pop_back();
            } else {
                // Número inteiro: converte string para int
                pontos.push_back(stoi(op));
            }
        }
        int total = 0;
        for (int p : pontos) {
            total += p;
        }
        return total;
    }
};
</int></string>

Implementação em Java

import java.util.ArrayList;
import java.util.List;

class Solution {
    public int calPoints(String[] ops) {
        List<integer> lista = new ArrayList<>();
        for (String op : ops) {
            int n = lista.size();
            if (op.equals("+")) {
                // Soma dos dois últimos
                lista.add(lista.get(n-1) + lista.get(n-2));
            } else if (op.equals("D")) {
                // Dobro do último
                lista.add(2 * lista.get(n-1));
            } else if (op.equals("C")) {
                // Remove o último
                lista.remove(n-1);
            } else {
                // Número inteiro
                lista.add(Integer.parseInt(op));
            }
        }
        int total = 0;
        for (int p : lista) {
            total += p;
        }
        return total;
    }
}
</integer>

Tags: LeetCode Algoritmos Estruturas de Dados C++ java

Publicado em 7-14 10:33