最近在51CTO上看到一到,感觉作者给的算法真的很难看懂,于是自己研究了一下,反正是花了不少时间。 

开始是6个数字,6层嵌套循环,添加的时候控制了一下规则。最后还是感觉不容易看懂,于是又做了一次改动

 
  1. /**
  2.  * 用1、2、2、3、4、5这六个数字, 用java写一个main函数,打印出所有不同的排列, 如:512234、412345等, 
  3.  * 要求:"4"不能在第三位,"3"与"5"不能相连 
  4.  *  
  5.  * @author Administrator 
  6.  *  
  7.  */ 
  8. public class NumerOrder2 { 
  9.  
  10.     public static void main(String[] args) { 
  11.         NumerOrder2 num = new NumerOrder2(); 
  12.         num.makeNum(); 
  13.         num.outPrint(); 
  14.     } 
  15.  
  16.     int[] nums = { 122345 }; 
  17.  
  18.     /** 
  19.      * 生成数字第一位 
  20.      */ 
  21.     private void makeNum() { 
  22.         for (int i = 0; i < nums.length; i++) { 
  23.             makeNum(i); 
  24.         } 
  25.     } 
  26.  
  27.     /** 
  28.      * 生成第二位数字 数组下标不能与第一位重复 
  29.      *  
  30.      * @param num1 
  31.      */ 
  32.     private void makeNum(int num1) { 
  33.  
  34.         for (int i = 0; i < nums.length; i++) {
    // 2位 
  35.             if (i == num1) 
  36.                 continue
  37.             makeNum(num1, i); 
  38.         } 
  39.  
  40.     } 
  41.  
  42.     /** 
  43.      * 生成第3位数字 数组下标不能与前2位重复 
  44.      *  
  45.      * @param num1 
  46.      * @param num2 
  47.      */ 
  48.     private void makeNum(int num1, int num2) { 
  49.         for (int i = 0; i < nums.length; i++) {
    // 2位 
  50.             if (i == num1 || i == num2 || nums[i] == 4
  51.                 continue
  52.             makeNum(num1, num2, i); 
  53.         } 
  54.  
  55.     } 
  56.  
  57.     /** 
  58.      * 生成第4位数字 数组下标不能与前3位重复 
  59.      *  
  60.      * @param num1 
  61.      * @param num2 
  62.      * @param num3 
  63.      */ 
  64.     private void makeNum(int num1, int num2, int num3) { 
  65.         for (int i = 0; i < nums.length; i++) {
    // 2位 
  66.             if (i == num1 || i == num2 || i == num3) 
  67.                 continue
  68.             makeNum(num1, num2, num3, i); 
  69.         } 
  70.     } 
  71.  
  72.     /** 
  73.      * 生成第5位数字 数组下标不能与前4位重复 
  74.      *  
  75.      * @param num1 
  76.      * @param num2 
  77.      * @param num3 
  78.      * @param num4 
  79.      */ 
  80.     private void makeNum(int num1, int num2, int num3, int num4) { 
  81.         for (int i = 0; i < nums.length; i++) {
    // 2位 
  82.             if (i == num1 || i == num2 || i == num3 || i == num4) 
  83.                 continue
  84.             makeNum(num1, num2, num3, num4, i); 
  85.         } 
  86.  
  87.     } 
  88.  
  89.     /** 
  90.      * 生成第6位数字 数组下标不能与前5位重复 
  91.      *  
  92.      * @param num1 
  93.      * @param num2 
  94.      * @param num3 
  95.      * @param num4 
  96.      * @param num5 
  97.      */ 
  98.     private void makeNum(int num1, int num2, int num3, int num4, int num5) { 
  99.  
  100.         for (int i = 0; i < nums.length; i++) {
    // 2位 
  101.             if (i == num1 || i == num2 || i == num3 || i == num4 || i == num5) 
  102.                 continue
  103.             makeNum(num1, num2, num3, num4, num5, i); 
  104.         } 
  105.     } 
  106.  
  107.     /** 
  108.      * 根据6位下标生成字符串 
  109.      *  
  110.      * @param num1 
  111.      * @param num2 
  112.      * @param num3 
  113.      * @param num4 
  114.      * @param num5 
  115.      * @param num6 
  116.      */ 
  117.     private void makeNum(int num1, int num2, int num3, int num4, int num5, 
  118.             int num6) { 
  119.         StringBuilder sb = new StringBuilder(); 
  120.         sb.append(nums[num1]).append(nums[num2]).append(nums[num3]) 
  121.                 .append(nums[num4]).append(nums[num5]).append(nums[num6]); 
  122.         add(sb.toString()); 
  123.     } 
  124.  
  125.     /** 
  126.      * 打印出全部信息 
  127.      */ 
  128.     private void outPrint() { 
  129.         System.out.println(list.size()); 
  130.         for (int i = 0; i < list.size(); i++) { 
  131.             System.out.println(i + ":\t" + list.get(i)); 
  132.         } 
  133.     } 
  134.  
  135.     List<String> list = new ArrayList<String>(); 
  136.  
  137.     /** 
  138.      * 添加到字符串列表 
  139.      * 首先 3和5不能连续 
  140.      * 然后已存在的字符串不需要重复添加,(针对两个2的情况过滤) 
  141.      * @param str 
  142.      */ 
  143.     private void add(String str) { 
  144.         if (str.indexOf("3") - 1 == str.indexOf("5"
  145.                 || str.indexOf("3") + 1 == str.indexOf("5")) 
  146.             return
  147.         if (!list.contains(str)) { 
  148.             list.add(str); 
  149.         } 
  150.  
  151.     }