- 重新排序得到 2 的幂
难度
中等
给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。
如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。
示例 1:
输入:1
输出:true
示例 2:
输入:10
输出:false
示例 3:
输入:16
输出:true
示例 4:
输入:24
输出:false
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reordered-power-of-2
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:找到当前数字的所有的全排列,然后挨个进行测
List<Character>list=new ArrayList<>();
List<List<Character>>lists=new ArrayList<>();
public boolean reorderedPowerOf2(int n) {
//1.利用回溯算法得到所有的数字排序组合
char[]chars=Integer.toString(n).toCharArray();
//2.开始回溯
dfs(chars,0,chars.length-1);
//3.进行判断
for(List<Character>ll:lists)
{
if(check(ll))
{
//System.out.println(ll.toString());
return true;}
}
return false;
}
public void dfs(char[] chars,int index,int end)
{
if(index==end)
{ //list.add(chars);
for(int i=0;i<chars.length;i++)
{
list.add(chars[i]);
}
//System.out.println(list.toString());
lists.add(new ArrayList<Character>(list));
list.clear();
}
else
for(int i=index;i<=end;i++)
{
swap(chars,index,i);
dfs(chars,index+1,end);
swap(chars,index,i);
}
//list.remove(list.size()-1);
}
public void swap(char[] chars,int i,int j)
{
char temp=chars[i];
chars[i]=chars[j];
chars[j]=temp;
}
public boolean check(List<Character>ll)
{
if(ll.get(0)=='0')
return false;
int sum=0;
for(int i=0;i<ll.size();i++)
{
int temp=ll.get(i)-'0';
sum=sum*10+temp;
}
return (sum& (sum - 1))==0;
}