给一个正整数N,将里面的每个数字任意重排,看是否能得到2的指数。

思路:2的次方数,也就2^0,2^1,2^2 ,...,2^30,共31个,只要把这31个数字,对应10进制求出来,然后对每一位上的数字进行统计,如果统计结果,与被验证的数字统计结果与其中的一个相同,那么这个被验证的数字一定可以组合成2的幂。需要注意的是,为了防止整型溢出,加码后的数字用长整型来表示即可。
时间复杂度:O(logN),空间复杂度:O(1)。
1class Solution {
2 public boolean reorderedPowerOf2(int N) {
3 long sum = helper(N);
4 for (int i = 0; i < 31; i++) {
5 if (helper(1 << i) == sum) { // 二进制运算,每次将1左移i位,即2的次方,然后再执行helper()。
6 return true;
7 }
8 }
9 return false;
10 }
11
12 // 将N中的每个数字 变成10的这个数字次方变为1,如 N=46,数字4变为10000,数字6变为1000000,然后加起来,得到1010000
13 private long helper(int N) {
14 long res = 0;
15 while (N > 0) {
16 res += Math.pow(10, N % 10);
17 N /= 10;
18 }
19 return res;
20 }
21}
文章转载自程序媛的梦想,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




