1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class Solution { public boolean reorderedPowerOf2(int n) { int currNum = 1; int[] nCountArray = countDigits(n); for (int pow = 0; pow < 30; pow++) { if (Arrays.equals(nCountArray, countDigits(currNum))) { return true; } currNum <<= 1; } return false; }
private int[] countDigits(int num) { int[] digitArray = new int[10]; while (num != 0) { digitArray[num % 10] += 1; num /= 10; } return digitArray; }
}
|
读题很重要. 一开始我以为是binary representation重新order digits就行了. 那样简单, 就看是否有且只有一个1即可.
实际题意是十进制reorder.
也很暴力的解法. 给我们的条件就是N的范围最大是10的9次方. 最大的2的power在整型数下是2147483648 / 2 = 1073741824.此时是2的30次方. 是10位. 那么2的29次方就是在N的边界以内最大的2的power了.
于是我们先获得N的每个digits的frequency. 然后我们再获得每个2的power的每个digit的frequency, 比较和N的digits的frequency是否都相同就ok了.
我们用array或者hashmap来存给定的一个数字的每个digit的frequency.
时间复杂度: O(1)
空间复杂度: O(1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public boolean reorderedPowerOf2(int n) { int currNum = 1; for (int pow = 0; pow < 30; pow++) { if (countDigits(currNum) == countDigits(n)) { return true; } currNum <<= 1; } return false; }
int countDigits(int num) { int ans = 0; while (num != 0) { ans += Math.pow(10, num % 10); num /= 10; } return ans; } }
|
由于N最大就是10的9次方, 那么N中0-9每个数字出现的频率不会超过9. 因此我们可以用一个数字记录N的digit count. LSB记录0出现的次数, LSB左侧一个记录1出现的次数…
如何统计? 让num每一位的十次方加到ans上就完事儿了. 这个做法很绝.
时间复杂度: O(1)
空间复杂度: O(1)