#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; } } // namespace 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; }