最近在51CTO上看到一到,感觉作者给的算法真的很难看懂,于是自己研究了一下,反正是花了不少时间。
开始是6个数字,6层嵌套循环,添加的时候控制了一下规则。最后还是感觉不容易看懂,于是又做了一次改动
- /**
- * 用1、2、2、3、4、5这六个数字, 用java写一个main函数,打印出所有不同的排列, 如:512234、412345等,
- * 要求:"4"不能在第三位,"3"与"5"不能相连
- *
- * @author Administrator
- *
- */
- public class NumerOrder2 {
- public static void main(String[] args) {
- NumerOrder2 num = new NumerOrder2();
- num.makeNum();
- num.outPrint();
- }
- int[] nums = { 1, 2, 2, 3, 4, 5 };
- /**
- * 生成数字第一位
- */
- private void makeNum() {
- for (int i = 0; i < nums.length; i++) {
- makeNum(i);
- }
- }
- /**
- * 生成第二位数字 数组下标不能与第一位重复
- *
- * @param num1
- */
- private void makeNum(int num1) {
- for (int i = 0; i < nums.length; i++) { // 2位
- if (i == num1)
- continue;
- makeNum(num1, i);
- }
- }
- /**
- * 生成第3位数字 数组下标不能与前2位重复
- *
- * @param num1
- * @param num2
- */
- private void makeNum(int num1, int num2) {
- for (int i = 0; i < nums.length; i++) { // 2位
- if (i == num1 || i == num2 || nums[i] == 4)
- continue;
- makeNum(num1, num2, i);
- }
- }
- /**
- * 生成第4位数字 数组下标不能与前3位重复
- *
- * @param num1
- * @param num2
- * @param num3
- */
- private void makeNum(int num1, int num2, int num3) {
- for (int i = 0; i < nums.length; i++) { // 2位
- if (i == num1 || i == num2 || i == num3)
- continue;
- makeNum(num1, num2, num3, i);
- }
- }
- /**
- * 生成第5位数字 数组下标不能与前4位重复
- *
- * @param num1
- * @param num2
- * @param num3
- * @param num4
- */
- private void makeNum(int num1, int num2, int num3, int num4) {
- for (int i = 0; i < nums.length; i++) { // 2位
- if (i == num1 || i == num2 || i == num3 || i == num4)
- continue;
- makeNum(num1, num2, num3, num4, i);
- }
- }
- /**
- * 生成第6位数字 数组下标不能与前5位重复
- *
- * @param num1
- * @param num2
- * @param num3
- * @param num4
- * @param num5
- */
- private void makeNum(int num1, int num2, int num3, int num4, int num5) {
- for (int i = 0; i < nums.length; i++) { // 2位
- if (i == num1 || i == num2 || i == num3 || i == num4 || i == num5)
- continue;
- makeNum(num1, num2, num3, num4, num5, i);
- }
- }
- /**
- * 根据6位下标生成字符串
- *
- * @param num1
- * @param num2
- * @param num3
- * @param num4
- * @param num5
- * @param num6
- */
- private void makeNum(int num1, int num2, int num3, int num4, int num5,
- int num6) {
- StringBuilder sb = new StringBuilder();
- sb.append(nums[num1]).append(nums[num2]).append(nums[num3])
- .append(nums[num4]).append(nums[num5]).append(nums[num6]);
- add(sb.toString());
- }
- /**
- * 打印出全部信息
- */
- private void outPrint() {
- System.out.println(list.size());
- for (int i = 0; i < list.size(); i++) {
- System.out.println(i + ":\t" + list.get(i));
- }
- }
- List<String> list = new ArrayList<String>();
- /**
- * 添加到字符串列表
- * 首先 3和5不能连续
- * 然后已存在的字符串不需要重复添加,(针对两个2的情况过滤)
- * @param str
- */
- private void add(String str) {
- if (str.indexOf("3") - 1 == str.indexOf("5")
- || str.indexOf("3") + 1 == str.indexOf("5"))
- return;
- if (!list.contains(str)) {
- list.add(str);
- }
- }
- }