diff --git a/cpp/2203/220326-CN.cpp b/cpp/2203/220326-CN.cpp new file mode 100644 index 0000000..ee9ffd4 --- /dev/null +++ b/cpp/2203/220326-CN.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include + +/** + * 682. Baseball Game + * You are keeping score for a baseball game with strange rules. The game consists of several rounds, where the scores of past rounds may affect future rounds' scores. + * At the beginning of the game, you start with an empty record. You are given a list of strings ops, where ops[i] is the ith operation you must apply to the record and is one of the following: + * - An integer x - Record a new score of x. + * - "+" - Record a new score that is the sum of the previous two scores. It is guaranteed there will always be two previous scores. + * - "D" - Record a new score that is double the previous score. It is guaranteed there will always be a previous score. + * - "C" - Invalidate the previous score, removing it from the record. It is guaranteed there will always be a previous score. + * Return the sum of all the scores on the record. + * + * 100% STL implementation! + */ + +class Solution { +public: + static int calPoints(std::vector& ops) { + std::vector scores; + std::for_each(ops.begin(), ops.end(), [&](const std::string& str) { + int x; + try { + x = std::stoi(str); + } catch (const std::invalid_argument& ignored) { + switch (str[0]) { + case '+': + scores.push_back(*std::prev(scores.end(), 2) + scores.back()); + break; + case 'C': + scores.pop_back(); + break; + case 'D': + scores.push_back(2 * scores.back()); + break; + default:; + } + return; + } + scores.push_back(x); + }); + return std::accumulate(scores.begin(), scores.end(), 0); + } +}; diff --git a/cpp/2203/CMakeLists.txt b/cpp/2203/CMakeLists.txt index 29f2853..5466d63 100644 --- a/cpp/2203/CMakeLists.txt +++ b/cpp/2203/CMakeLists.txt @@ -3,4 +3,4 @@ PROJECT(2203) SET(CMAKE_CXX_STANDARD 23) -ADD_EXECUTABLE(2203 220326.cpp) +ADD_EXECUTABLE(2203 220326-CN.cpp)