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条)

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码