枚举时,先看看循环边界---脑筋急转弯,挖掘隐含题意
例:十位平方数0~9这10个数字不重复、不遗漏,可以组成很多10位数字。这其中也有很多恰好是平方数(是某个数的平方)。比如:1026753849,就是其中最小的一个平方数。请你找出其中最大的一个平方数是多少?
一.常规思想来枚举:从9876543210开始到1026753849找最先出现的平方数
a.枚举答案X [9876543210, 1026753849]
b.判断是不是恰好0-9十个数字
c.判断是不是完全平方数 令Y = int(sqrt(X)) 判断Y * Y == X?
二.隐含题意:平方数的定义:Y * Y == X 求X根据题意可知 X最大为9876543210,
则可知Y的范围[350000,100000]枚举Y,拆分X,判断X是不是0-9这10位数组成
可用Set集合来简化判断
package 十位平方数;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 350000, 100000
Set<Integer> set=new HashSet<Integer>();
for(int i=350000;i>=100000;i--){
// set=null;
int x=i*i;
int xt=x;
while(x!=0){
int t=x%10;
set.add(t);
x=x/10;
}
if(check(set)){
System.out.println(i);
System.out.println(xt);
break;
}
else{
set=new HashSet<Integer>();
}
}
}
public static boolean check(Set<Integer>set){
if(set.size()==10){
return true;
}else{
return false;
}
}
}