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.
Example 1:
Input: 1Output: true
Example 2:
Input: 10Output: false
Example 3:
Input: 16Output: true
Example 4:
Input: 24Output: false
Example 5:
Input: 46Output: true
Note:
1 <= N <= 10^9
class Solution {public: bool reorderedPowerOf2(int N) { string str = to_string(N); sort(str.begin(), str.end()); for (int i = 0; i < 31; ++i) { string t = to_string(1 << i); sort(t.begin(), t.end()); if (t == str) return true; } return false; }};下面这种方法没有将数字转为字符串并排序,而是使用了另一种比较巧妙的方法来实现类似的功能,是通过对N的每位上的数字都变为10的倍数,并相加,这样相当于将N的各位的上的数字都加码到了10的指数空间,而对于所有的2的指数,进行相同的操作,只要某个加码后的数字跟之前整数N的处理后的数字相同,则说明N是符合题意的。需要注意的是,为了防止整型移除,加码后的数字用长整型来表示即可,参见代码如下: 解法二:
class Solution {public: bool reorderedPowerOf2(int N) { long sum = helper(N); for (int i = 0; i < 31; i++) { if (helper(1 << i) == sum) return true; } return false; } long helper(int N) { long res = 0; for (; N; N /= 10) res += pow(10, N % 10); return res; }};讨论:对于这种验证数字的问题,总是有穷举法出现,参见,是能把考官气死的方法,哈哈~ 参考资料: