https://leetcode.com/problems/baseball-game Easy

Условие

Вы ведёте счёт бейсбольной игры. Правила для получения счёта представлены в виде списка строк operations, где каждая операция имеет одно из следующих значений:

• Целое число (может быть положительным или отрицательным) — добавьте это число в текущий счёт.

"+" – добавьте в счёт сумму двух предыдущих результатов.

"D" – удвойте предыдущий результат и добавьте его в счёт.

"C" – отмените последний результат и удалите его из счёта.

Гарантируется, что после выполнения всех операций счёт будет корректным.

Примеры

Input: operations = ["5", "2", "C", "D", "+"] Output: 30 Explanation:

"5" - добавляем 5 в счёт. Список очков: [5]. "2" - добавляем 2 в счёт. Список очков: [5, 2]. "C" - отменяем последний результат. Список очков: [5]. "D" - удваиваем последний результат (5 * 2 = 10). Список очков: [5, 10]. "+" - добавляем сумму двух последних результатов (5 + 10 = 15). Список очков: [5, 10, 15]. Итоговый счёт: 5 + 10 + 15 = 30.

Input: operations = ["5", "-2", "4", "C", "D", "9", "+", "+"] Output: 27 Explanation:

"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.

Input: operations = ["1", "C"] Output: 0 Explanation:

"1" - добавляем 1 в счёт. Список очков: [1]. "C" - отменяем последний результат. Список очков: []. Итоговый счёт: 0.

Решение

fun calPoints(operations: Array<String>): Int {
    val stack = mutableListOf<Int>() // Создаём стек для хранения очков
    for (op in operations) {
        when (op) {
            "+" -> {
                // Добавляем сумму двух последних очков
                val last = stack[stack.size - 1]
                val secondLast = stack[stack.size - 2]
                stack.add(last + secondLast)
            }
            "D" -> {
                // Удваиваем последнее очко
                val last = stack.last()
                stack.add(2 * last)
            }
            "C" -> {
                // Удаляем последнее очко
                stack.removeAt(stack.size - 1)
            }
            else -> {
                // Добавляем число в стек
                stack.add(op.toInt())
            }
        }
    }
    return stack.sum() // Возвращаем сумму всех очков
}

Временная сложность

O(n), где n — количество операций.