题目: 每个数字的十进制表示中(0~9),每个数位各不相同且各个数位之和等于N。满足条件的数字可能很多,找到其中的最小值即可。
N的取值范围: 1<=N<=1000
空间复杂度: 空间复杂度 O(1) 时间复杂度:时间复杂度 O(n)
思考......
编程......
测试......
修改......
终于......
本人的错误思路:
@org.junit.Test
public void testOne(){
Scanner sc = new Scanner(System.in);
boolean flag = false;
while_flag:while(!flag){
System.out.println("请输入一个证书n,并要求1<=n<=1000:");
Integer n = sc.nextInt();
//判断数字是否满足条件
if( n>=1 && n<=1000){
//输入的数满足条件继续向下执行
flag = true;
//创建set集合 存放所有满足条件的数
HashSet set = new HashSet();
//理解成结果集是两位数了 ......
for(int i=0; i<=9 i++){
for(int j=0; j<=9 j++){ //两层循环进行组合 跳出满足条件的数
String num = i+""+j;
Integer integer = Integer.valueOf(num);
if(i+j = n){
set.add(integer);
}
}
}
//判断是否有满足条件的结果集,set集合的size()大于0表示有满足条件的结果,否则输出-1
if(set.size()>0){
Integer min = Collections.min(set); //获取集合中的最小值
System.out.println(min);
}else{
System.out.println(-1);
}
}else{
//不满足条件,程序从头执行
flag = false;
System.out.println("输入的数字不满足条件!");
continue while_flag;
}
}
}
查阅资料后发现,自己好垃圾,思路就错了。PDD-数字组合编程题
正解:
@org.junit.Test
public void testTwo(){
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数N,并且要求1<=N<=1000:");
int N = sc.nextInt();
//0~9 组成的各位不重复的多位数中,各位数字之和最大为:1+2+3+4+5+6+7+8+9=45,
//故N的超过45,应返回-1
if(N>45){
System.out.println(-1);
return; //程序结束
}
//N<10时 其本身就是众多结果集中最小的值,故返回本身
if(N<10){
System.out.println(N);
return; //程序结束
}
//对于其它数 做以下处理
int nums = 0; //结果数字
int digit = 0; //用来处理各位数的值 配合Math.pow(x,y)使用
//从9到0倒叙循环,数越大的越靠近数字的左侧,才能保证数字最小
for(int i = 9; i > 0; i--){
if(i<=N){
N -= i; //N-i,直到N=0为止
nums += (int)Math.pow(10,digit)*i;
digit++;
}
}
System.out.println(nums);
}
受打击急了,上班摸会鱼不好么,看啥算法题,看完自信心受打击了.......有机会多练练吧还是!!!!!



