重新排序得到2的幂
869.重新排序得到2的幂
题目描述
思路:搜索回溯
将n的十进制表示视作一个字符数组,我们可以枚举该数组的所有排列,对每个不含前导零的排列判断其对应的整数是否为2的幂。
其中包含两个子问题:
- 枚举可能包含重复字符的数组的全排列。
- 判断一个整数是否为2的幂。
具体来说,可以在递归搜索全排列的同时,计算当前排列的已枚举的部分所对应的整数num。在枚举当前排列的下一个字符ch时,将ch加到num末尾,即num=num*10+ch-‘0’,然后递归进入下一层。
def isPowerOfTwo(n):
return (n & (n-1)) == 0
class Solution:
def reorderedPowerOf2(self, n: int) -> bool:
nums = sorted(list(str(n)))
m = len(nums)
vis = [False] * m
def backtrack(idx, num):
if idx == m:
return isPowerOfTwo(num)
for i, ch in enumerate(nums):
if (num == 0 and ch == '0') or vis[i] or (i > 0 and not vis[i-1] and ch == nums[i-1]):
continue
vis[i] = True
if backtrack(idx+1, num*10+ord(ch)-ord('0')):
return True
vis[i] = False
return False
return backtrack(0, 0)