1. 程式人生 > >[Math_Medium] 869. Reordered Power of 2

[Math_Medium] 869. Reordered Power of 2

com n) 重新 ble leet result 每一個 一個 this

原題:869. Reordered Power of 2

Starting with a positive integer N, we reorder the digits in any order (including the original order) such that the leading digit is not zero.
Return true if and only if we can do this in a way such that the resulting number is a power of 2.1 <= N <= 10^9

題目大意:

給你一個數N(1 <= N <= 10^9),你可以對這個數中的每個數字進行重排組成另外一個數字,只要存在一個使得這個數是2的冪,則返回True;例如N=46,你可以重組為64,這樣64就是2的冪了,則返回True,

解題思路:

因為1 <= N <= 10^9,而$ 2^{32}$>\(10^{9}\),因此,最多只有\(2^{0}\)\(2^{1}\)\(2^{2}\).....\(2^{31}\)共32個數,每個數都是不相同的,因此,我們只要判斷N中每個數字的個數是否和之前的32個數中某一個數中的每一個數字的個數是否相同,只要相同數字的個數相同,那麽就可以重新組合成那個數。因此,我們可以把N中的每個數字分解出來,存在一個長度為10的數組裏面,然後將這個數組與前面32個數字分解的數組去對比,只要相等,就符合;
但是,兩個數組是否相等比較麻煩,這樣,我們又可以把每個數字設為10的多少次方,這樣就沒必要去比較整個數組是否相等,直接把這組數字用10的多少次方表示出來;比如N=4654,其中有2個4,1個5,1個6,因此可以表示為:\(10^{4}\)

+\(10^{4}\)+\(10^{5}\)+\(10^{6}\),這樣出來的結果是唯一的,因此可以比較

代碼如下:

class Solution {
public:
    bool reorderedPowerOf2(int N) 
    {
        long ans;
        ans=count(N);
        for (int i=0;i<32;i++)
        {
            if (count(1<<i)==ans)
            {
                return true;
            }
        }
        return false;
    }
    long count(int N)
    {
        long ans = 0;
        while(N>0)
        {
            ans+=pow(10,N%10);
            N/=10;
        }
        return ans;
    }
};

[Math_Medium] 869. Reordered Power of 2