Reordered Power of 2

medium math counting sorting

Problem

Given a positive integer n, return true if some permutation of its digits (with no leading zero) equals a power of two. Two numbers use the same digits exactly when their sorted digit strings — or digit-count signatures — match, so we just compare n against each power of two.

Inputn = 46
Outputtrue
Rearranging 46 gives 64 = 2⁶.

def reordered_power_of_2(n):
    sig = sorted(str(n))
    p = 1
    while p <= 10 ** 9:
        if sorted(str(p)) == sig:
            return True
        p *= 2
    return False
function reorderedPowerOf2(n) {
  const sig = (x) => String(x).split("").sort().join("");
  const target = sig(n);
  for (let p = 1; p <= 1e9; p *= 2) {
    if (sig(p) === target) return true;
  }
  return false;
}
boolean reorderedPowerOf2(int n) {
    String target = sig(n);
    for (long p = 1; p <= 1_000_000_000L; p *= 2) {
        if (sig((int) p).equals(target)) return true;
    }
    return false;
}
private String sig(int x) {
    char[] c = Integer.toString(x).toCharArray();
    Arrays.sort(c);
    return new String(c);
}
string sig(long long x) {
    string s = to_string(x);
    sort(s.begin(), s.end());
    return s;
}
bool reorderedPowerOf2(int n) {
    string target = sig(n);
    for (long long p = 1; p <= 1000000000LL; p *= 2)
        if (sig(p) == target) return true;
    return false;
}
Time: O(log²(max)) Space: O(log(max))