给出下题的算法(Java语言实现)
将1、2、3、4、5、6、7、8、9 这九个数字分成三个百位数,每个数字用且只用一次,
并且第三个数字是第一个的3倍,第二个数字是第一个的2倍。
求三个数。[说明,结果可能多于一组,例如327 654 981]
这个是看到一家公司的面试题目,想了一下还没有找到什么好的方法来解决。
请各位帮下忙。
一道java面试题目
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
7条回答 默认 最新
- tengxg 2009-09-25 21:10关注
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;public class Test {
public static void main(String[] args) { int i,j,k,m,n,t1,t2,t3; Set total=new HashSet(); for(int t=1;t<10;t++) { total.add(t); } Set set=new HashSet(); Set lastThree=new HashSet(); for(i=1;i<4;i++) { set.add(i); for(j=1;j<10;j++) { if(j==i){ continue;} set.add(j); for(k=1;k<10;k++) { if(k==i||k==j) { continue;} set.add(k); m=3*(i*100+j*10+k); if(m>987){set.remove(k);continue;}//如果已超出范围,没必要再往下判断 t1=m%10; if(t1==0) {set.remove(k);continue;} //个位数 t2=(m%100)/10; if(t2==0) {set.remove(k);continue;} //十位数 t3=m/100; if(t3==0) {set.remove(k);continue;}//百位数 if(set.contains(t1)){set.remove(k);continue;} set.add(t1); if(set.contains(t2)) {set.remove(k);set.remove(t1);continue;} set.add(t2); if(set.contains(t3)) {set.remove(k);set.remove(t1);set.remove(t2);continue;} set.add(t3); //System.out.println(" "+i+j+k+" "+m); total.removeAll(total); for(int q=1;q<10;q++) { total.add(q); } total.removeAll(set); int[] s=new int[3]; Iterator iterator=total.iterator(); int p=0; while(iterator.hasNext()) { s[p]=Integer.parseInt(iterator.next()+""); p++; } n=s[0]*100+s[1]*10+s[2]; if(n==2*(i*100+j*10+k)) { System.out.println(i+""+j+""+k+" "+n+" "+m);} n=s[0]*100+s[2]*10+s[1]; if(n==2*(i*100+j*10+k)) { System.out.println(i+""+j+""+k+" "+n+" "+m);} n=s[1]*100+s[0]*10+s[2]; if(n==2*(i*100+j*10+k)) { System.out.println(i+""+j+""+k+" "+n+" "+m);} n=s[1]*100+s[2]*10+s[0]; if(n==2*(i*100+j*10+k)) { System.out.println(i+""+j+""+k+" "+n+" "+m);} n=s[2]*100+s[0]*10+s[1]; if(n==2*(i*100+j*10+k)) { System.out.println(i+""+j+""+k+" "+n+" "+m);} n=s[2]*100+s[1]*10+s[0]; if(n==2*(i*100+j*10+k)) { System.out.println(i+""+j+""+k+" "+n+" "+m);} set.remove(t1); set.remove(t2); set.remove(t3); set.remove(k); } set.remove(j); } set.remove(i); } }
}
运行结果:
192 384 576
219 438 657
273 546 819
327 654 981我的思想是,第一个数百位数最大为3,可谓一层循环,十位和各位则组成两层循环。
用一个Set容器来存储第一个三位数,利用第一个数求出第三个数(3倍第一个数),把第三个数的每一位求出,看是否符合,符合则加入set容器,而这时只剩下三个数,对这三个数的六种情况求解,等于第一个数的两倍即成立。很麻烦,思想很简单本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥20 西南科技大学数字信号处理
- ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
- ¥30 STM32 INMP441无法读取数据
- ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
- ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
- ¥15 用visualstudio2022创建vue项目后无法启动
- ¥15 x趋于0时tanx-sinx极限可以拆开算吗
- ¥15 pyqt信号槽连接写法
- ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
- ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。