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 iqoo11 如何下载安装工程模式
  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?