From 84eba00e335bf6e8fd98e14b23c91d9120bb9c3a Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Fri, 26 Aug 2022 23:52:22 +0200 Subject: [PATCH] =?UTF-8?q?problems(cpp):=20add=20=E2=80=9E869.=20Reordere?= =?UTF-8?q?d=20Power=20of=202=E2=80=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- problems/reordered-power-of-2.cpp | 119 ++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 problems/reordered-power-of-2.cpp diff --git a/problems/reordered-power-of-2.cpp b/problems/reordered-power-of-2.cpp new file mode 100644 index 0000000..3734223 --- /dev/null +++ b/problems/reordered-power-of-2.cpp @@ -0,0 +1,119 @@ +#include +#include +#include + +namespace { + +bool is_power_of_2(int n) +{ + return (n & (n - 1)) == 0; +} + +class permutations { + using values_t = typename std::vector; + + class p_iter { + values_t elements; + bool last; + + public: + p_iter(values_t elements, bool last = false) + : elements(elements) + , last(last) + { + } + + const values_t& operator*() const { return elements; } + + p_iter& operator++() + { + if (!std::next_permutation(elements.begin(), elements.end())) { + last = true; + } + return *this; + } + + bool operator==(const p_iter& other) const + { + return last == other.last && elements == other.elements; + } + + bool operator!=(const p_iter& other) const { return !(*this == other); } + }; + + values_t elements; + +public: + permutations(const values_t& input_ints) + : elements(input_ints) + { + std::sort(elements.begin(), elements.end()); + } + + p_iter begin() const { return { elements, elements.empty() }; } + p_iter end() const { return { elements, true }; } +}; + +std::vector to_vector(int n) +{ + if (n == 0) { + return std::vector(1, 0); + } + + std::vector digits; + + while (n > 0) { + digits.push_back(n % 10); + n /= 10; + } + + return digits; +} + +int to_number(const std::vector digits) +{ + int number = 0; + + for (auto digit : digits) { + number = number * 10 + digit; + } + + return number; +} + +} + +class Solution { +public: + bool reorderedPowerOf2(int n) + { + for (const auto& permutation : permutations(to_vector(n))) { + if (permutation.front() == 0) { + continue; + } + + if (is_power_of_2(to_number(permutation))) { + return true; + } + } + + return false; + } +}; + +int main() +{ + Solution s; + + assert(s.reorderedPowerOf2(1)); + assert(s.reorderedPowerOf2(2)); + assert(s.reorderedPowerOf2(4)); + assert(s.reorderedPowerOf2(8)); + assert(s.reorderedPowerOf2(16)); + assert(s.reorderedPowerOf2(61)); + + assert(!s.reorderedPowerOf2(10)); + assert(!s.reorderedPowerOf2(20)); + + return 0; +}