题目:
凑平方数 把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。 比如:0, 36, 5948721 再比如: 1098524736 1, 25, 6390784 0, 4, 289, 15376 等等... 注意,0可以作为独立的数字,但不能作为多位数字的开始。 分组时,必须用完所有的数字,不能重复,不能遗漏。 如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案? 注意:需要提交的是一个整数,不要填写多余内容。
思路: 暴力 dfs + 回溯剪枝
先递归出所有10,000,000,000 以下的平方数, 用set<Long> 进行存储。然后 用dfs算法, 进行排列组合,得出结果。
代码:
package come_on; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Second { static ArrayList<Long> num = new ArrayList<Long>(); static int counting=0; public static void main(String args[]){ long temp = 0; for(int i=0;i<100000;i++){ temp= (long)i*(long)i; char []n = String.valueOf(temp).toCharArray(); Set<Character> set = new HashSet<>(); for(int j=0;j<n.length;j++){ set.add(n[j]); } if(set.size()==n.length){ num.add(temp); } } //遍历num数组,打印出所有的满足条件的平方数 // Iterator<Long> it = num.iterator(); // while(it.hasNext()){ // System.out.println(it.next()); // } Set<Long> number = new HashSet<>(); dfs(0,number); System.out.println(counting); } public static void dfs(int start,Set<Long> number){ if(getSize(number)==10){ counting++; return; } else { for(int i=start;i<num.size();i++){ int n = getSize(number)+String.valueOf(num.get(i)).toCharArray().length; if(n>10){ continue; } else{ number.add(num.get(i)); if(check(number)){ dfs(i+1,number); } number.remove(num.get(i)); } } } } public static boolean check(Set<Long> number){ Set<Character> set = new HashSet<>(); Iterator<Long> it = number.iterator(); long item =0; while (it.hasNext()){ item= it.next(); for(int i =0;i<String.valueOf(item).toCharArray().length;i++){ set.add(String.valueOf(item).toCharArray()[i]); } } if(set.size()==getSize(number)){ return true; } else { return false; } } public static int getSize(Set<Long> number){ Iterator<Long> it = number.iterator(); int sum=0; while(it.hasNext()){ sum+= String.valueOf(it.next()).toCharArray().length; } return sum; } }
启发:
1、注意 long 类型, 求temp = i*i 的时候, 也要把 i 转成long类型, 否则会出现数据溢出
2、结果不对, debug的时候分模块去测试, 首先先确认拿到了正确的平方数set,再测试 check 和 getSize ,再在主要的dfs函数中推逻辑错误。