一著名软件公司的java笔试算法题的答案

    技术2022-05-11  65

     原题如下:用1、2、2、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。

     解题思路:

     很明显,这是一个递归算法。我们可以排列将这6个数按从小到大的顺序排一下,如果是1,2,3,4,5,6,那么会有1*2*3*4*5*6=6!=720个递增的数。但如果是1,2,2,3,4,5,那么在这720个数中一定会有相同的数对出现(由于在这6个数中只有两个数两同,也就是说,如果有重复的数,那么一定是一对数,如122345会出现两次)。

    排列的基本规则是分步进行。也就是说,要排列上面6个数,首先应该选择第一个数,这第一个数可以选择这6个数中的任意一个,如选择1.第二步是选择第二个数,这第二个数不能再选择已经选过的数,如1.因此,它只能从后面5个数中选择。如选择2。以此类推。

    我们也可以在程序中模拟这一过程。源程序如下:public class test1{ private int[] numbers = new int[] { 1, 2, 3, 3, 4, 5 }; public int n; private String lastResult = "";

     private boolean validate(String s) {  if (s.compareTo(lastResult) <= 0)   return false;  if (s.charAt(2) == '4')   return false;  if (s.indexOf("35") >= 0 || s.indexOf("53") >= 0)   return false;  return true; } public void list(String index, String result) {  for (int i = 0; i < numbers.length; i++)  {   if (index.indexOf(i + 48) < 0)   {    String s = result + String.valueOf(numbers[i]);    if (s.length() == numbers.length)    {     if (validate(s))     {      System.out.println(s);      lastResult = s;      n++;     }     break;    }    list(index + String.valueOf(i), s);   }  } } public static void main(String[] args) {  test1 t = new test1();  t.list("", "");  System.out.println("总数:" + t.n);

     }}

    其中list函数是这个算法的核心函数。index参数表示已经选择过的数,用numbers数组的索引表示。如index="012",表示numbers的前三个数已经被选择,也表示应该选择第四个数了,而这第四个数应该从后三个数中选择。result参数表示临时的数字组合(这个数字组合最多是5个数字,因为,如果到了6个数字,就表示已经有一个结果产生了)。在默认情况下index和result的值都是""。

    在validate中使用了  if (s.compareTo(lastResult) <= 0)进行判断,由于按这种方法进行排列,如果这6个数是递增给出的,那么排列的结果一定是递增的,但上述的6个数其中第2和第3个位置上都是2,因此,如果出现了上一个结果不小于当前结果的情况,一定是有重复了,因此,要将这部分数过滤出去。

    使用1, 2, 2, 3, 4, 5的测试结果122345122543123245123254123425123452125234125243125423125432132245132254132425132452132524132542142325142523143225143252145223145232152234152243152324152342152423152432212345212543213245213254213425213452215234215243215423215432221345221543223145223154223415223451225134225143225413225431231245231254231425231452231524231542232145232154232415232451232514232541241325241523242315242513243125243152243215243251245123245132245213245231251234251243251324251342251423251432252134252143252314252341252413252431312245312254312425312452312524312542315224315242315422321245321254321425321452321524321542322145322154322415322451322514322541325124325142325214325241325412325421341225341252341522342125342152342215342251342512342521345122345212345221412325412523413225413252415223415232421325421523422315422513423125423152423215423251425123425132425213425231431225431252431522432125432152432215432251432512432521451223451232451322452123452132452213452231452312452321512234512243512324512342512423512432513224513242513422521234521243521324521342521423521432522134522143522314522341522413522431523124523142523214523241523412523421541223541232541322542123542132542213542231542312542321543122543212543221总数:198

    使用1,2, 3, 3, 4, 5的测试结果123345125433132345132543133245133254133425133452143325145233152334152343152433213345215433231345231543233145233154233415233451243315245133251334251343251433312345312543313245313254313425313452315234315243315423315432321345321543323145323154323415323451325134325143325413325431331245331254331425331452331524331542332145332154332415332451332514332541341325341523342315342513343125343152343215343251345123345132345213345231413325415233423315425133431325431523432315432513433125433152433215433251451233451323451332452133452313452331512334512343512433513234513243513324513342513423513432521334521343521433523134523143523314523341523413523431541233541323541332542133542313542331543123543132543213543231543312543321总数:118

    使用1, 3, 3, 3, 4, 5的测试结果

    133345313345315433331345331543333145333154333415333451343315345133433315451333513334513343513433541333543133543313543331总数:20

     

     

     


    最新回复(0)