From 7c317607f45fdb1e280bc96455456730a1841180 Mon Sep 17 00:00:00 2001 From: Lam Haoyin Date: Wed, 2 Mar 2022 22:20:46 +0800 Subject: [PATCH] add: 220302-CN [cpp] --- cpp/2203/220302-CN.cpp | 104 ++++++++++++++++++++++++++++++++++++++++ cpp/2203/CMakeLists.txt | 2 +- 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 cpp/2203/220302-CN.cpp diff --git a/cpp/2203/220302-CN.cpp b/cpp/2203/220302-CN.cpp new file mode 100644 index 0000000..dc28c8d --- /dev/null +++ b/cpp/2203/220302-CN.cpp @@ -0,0 +1,104 @@ +#include +#include + +class Solution { +private: + static inline constexpr unsigned long long diffULL(unsigned long long x, unsigned long long y) { + return std::max(x, y) - std::min(x, y); + } + + static inline constexpr unsigned long long gen1001(unsigned long long n) { + int digits = 1; + for (auto i = n; i > 9; i /= 10) + ++digits; + unsigned long long ret = 1; + for (int i = 0; i < digits; ++i) + ret *= 10; + return ret + 1; + } + + static inline constexpr unsigned long long gen999(unsigned long long n) { + int digits = 1; + for (auto i = n; i > 9; i /= 10) + ++digits; + unsigned long long ret = 1; + for (int i = 1; i < digits; ++i) + ret *= 10; + return ret - 1; + } + +public: + static std::string nearestPalindromic(const std::string& n) { + auto nNum = std::stoull(n); + if (nNum <= 10) + return std::to_string(nNum - 1); + else if (nNum == 11) + return "9"; + else if (nNum <= 16) + return "11"; + else if (nNum <= 26) + return "22"; + + auto nLen = n.length(); + if (nLen & 1) { + auto absMin = 0xFFFFFFFFFFFFFFFFULL; + std::string ans; + for (int i = -1; i <= 1; ++i) { + std::string prefix = n.substr(0, nLen >> 1); + std::string thisNumStr = prefix; + thisNumStr.push_back(std::isdigit(n[nLen >> 1] + i) ? (n[nLen >> 1] + i) : n[nLen >> 1]); + thisNumStr.insert(thisNumStr.end(), prefix.rbegin(), prefix.rend()); + auto thisNum = std::stoull(thisNumStr); + if (thisNum == nNum) + continue; + if (diffULL(thisNum, nNum) < absMin || (diffULL(thisNum, nNum) == absMin && thisNum < std::stoull(ans))) { + absMin = diffULL(thisNum, nNum); + ans = thisNumStr; + } + } + + auto retNum = std::stoull(ans); + if (!absMin || (gen1001(nNum) != nNum && (diffULL(gen1001(nNum), nNum) < absMin || (diffULL(gen1001(nNum), nNum) == absMin && gen1001(nNum) < retNum)))) { + absMin = diffULL(gen1001(nNum), nNum); + retNum = gen1001(nNum); + } + + if (!absMin || (gen999(nNum) != nNum && (diffULL(gen999(nNum), nNum) < absMin || (diffULL(gen999(nNum), nNum) == absMin && gen999(nNum) < retNum)))) { + retNum = gen999(nNum); + } + + return std::to_string(retNum); + } else { + auto prefixNum = std::stoull(n.substr(0, nLen >> 1)), absMin = 0xFFFFFFFFFFFFFFFFULL; + std::string ans; + for (int i = -1; i <= 1; ++i) { + auto thisPrefix = std::to_string(prefixNum + i); + auto thisNumStr = thisPrefix; + thisNumStr.insert(thisNumStr.end(), thisPrefix.rbegin(), thisPrefix.rend()); + auto thisNum = std::stoull(thisNumStr); + if (thisNum == nNum) + continue; + if (diffULL(thisNum, nNum) < absMin || (diffULL(thisNum, nNum) == absMin && thisNum < std::stoull(ans))) { + absMin = diffULL(thisNum, nNum); + ans = thisNumStr; + } + } + + auto retNum = std::stoull(ans); + if (!absMin || (gen1001(nNum) != nNum && (diffULL(gen1001(nNum), nNum) < absMin || (diffULL(gen1001(nNum), nNum) == absMin && gen1001(nNum) < retNum)))) { + absMin = diffULL(gen1001(nNum), nNum); + retNum = gen1001(nNum); + } + + if (!absMin || (gen999(nNum) != nNum && (diffULL(gen999(nNum), nNum) < absMin || (diffULL(gen999(nNum), nNum) == absMin && gen999(nNum) < retNum)))) { + retNum = gen999(nNum); + } + + return std::to_string(retNum); + } + } +}; + +int main() { + std::cout << Solution::nearestPalindromic("12389"); +} diff --git a/cpp/2203/CMakeLists.txt b/cpp/2203/CMakeLists.txt index 17c58fa..71f8484 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 220301.cpp) +ADD_EXECUTABLE(2203 220302-CN.cpp)