chao881208 2009-09-25 08:40
浏览 292
已采纳

一道java面试题目

给出下题的算法(Java语言实现)
将1、2、3、4、5、6、7、8、9 这九个数字分成三个百位数,每个数字用且只用一次,
并且第三个数字是第一个的3倍,第二个数字是第一个的2倍。
求三个数。[说明,结果可能多于一组,例如327 654 981]
这个是看到一家公司的面试题目,想了一下还没有找到什么好的方法来解决。
请各位帮下忙。

  • 写回答

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容器,而这时只剩下三个数,对这三个数的六种情况求解,等于第一个数的两倍即成立。很麻烦,思想很简单

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。