黑马程序员技术交流社区

标题: 这个题很难啊 [打印本页]

作者: 刘小白    时间: 2016-8-2 17:07
标题: 这个题很难啊
1.ABCDE这五个字母,写一个类,打印出所有的排序,如:ABBCDEEDCBAA等,要求:“D”不能在第3位,“C”与“E”不能相临。

谁来救救我


作者: caolufo    时间: 2016-8-2 19:19
给你一种思路:用排除法
1、写出所有的组合
2、找出第三位是D的字符串,删掉
3、匹配字符串中含有“CE”,"EC"的,删掉
作者: Observer    时间: 2016-8-2 19:22
这是学到多少天了
作者: z6677    时间: 2016-8-2 20:01
不知道、、、、
作者: cat73    时间: 2016-8-2 20:11
本帖最后由 cat73 于 2016-8-2 23:11 编辑

[Java] 纯文本查看 复制代码
import java.util.Arrays;

public final class Main {
    public static void main(final String[] args) {
        Main.traverse(new Character[] { 'A', 'B', 'C', 'D', 'E' }, 0, chars -> {
            // 第三位不能为 D
            if (chars[2].equals('D')) {
                return;
            }

            // C 跟 E 不能相邻
            if (Math.abs(Main.indexOf(chars, 'C') - Main.indexOf(chars, 'E')) == 1) {
                return;
            }

            // 输出结果
            System.out.println(Arrays.toString(chars));
        });
    }

    /**
     * 遍历几个元素的所有可能的组合
     *
     * @param array 元素列表
     * @param index 请传 0
     * @param out 结果输出的接口
     */
    public static <T> void traverse(final T[] array, final int index, final TraverseOut<T> out) {
        if (index == array.length - 1) {
            out.invoke(array);
        } else {
            for (int index2 = index; index2 < array.length; index2++) {
                Main.swap(array, index, index2);
                Main.traverse(array, index + 1, out);
                Main.swap(array, index, index2);
            }
        }
    }

    /**
     * 交换数组中的两个元素
     *
     * @param array 数组
     * @param index1 元素 1 的位置
     * @param index2 元素 2 的位置
     */
    public static <T> void swap(final T[] array, final int index1, final int index2) {
        final T t = array[index1];
        array[index1] = array[index2];
        array[index2] = t;
    }

    /**
     * 在数组中搜索指定元素
     *
     * @param array 数组
     * @param key 目标元素
     * @return 元素所在的位置,如果未找到则返回 -1
     */
    public static <T> int indexOf(final T[] array, final T key) {
        for (int i = 0; i < array.length; i++) {
            if (array == key) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 遍历结果输出的接口
     *
     * @author cat73
     */
    @FunctionalInterface
    public static interface TraverseOut<T> {
        void invoke(T[] t);
    }
}

输出:
  1. [A, B, C, D, E]
  2. [A, B, E, D, C]
  3. [A, C, B, D, E]
  4. [A, C, B, E, D]
  5. [A, D, C, B, E]
  6. [A, D, E, B, C]
  7. [A, E, B, D, C]
  8. [A, E, B, C, D]
  9. [B, A, C, D, E]
  10. [B, A, E, D, C]
  11. [B, C, A, D, E]
  12. [B, C, A, E, D]
  13. [B, D, C, A, E]
  14. [B, D, E, A, C]
  15. [B, E, A, D, C]
  16. [B, E, A, C, D]
  17. [C, B, A, D, E]
  18. [C, B, A, E, D]
  19. [C, B, E, D, A]
  20. [C, B, E, A, D]
  21. [C, A, B, D, E]
  22. [C, A, B, E, D]
  23. [C, A, E, D, B]
  24. [C, A, E, B, D]
  25. [C, D, A, B, E]
  26. [C, D, A, E, B]
  27. [C, D, B, A, E]
  28. [C, D, B, E, A]
  29. [C, D, E, B, A]
  30. [C, D, E, A, B]
  31. [D, B, C, A, E]
  32. [D, B, E, A, C]
  33. [D, C, B, A, E]
  34. [D, C, B, E, A]
  35. [D, C, A, B, E]
  36. [D, C, A, E, B]
  37. [D, A, C, B, E]
  38. [D, A, E, B, C]
  39. [D, E, A, C, B]
  40. [D, E, A, B, C]
  41. [D, E, B, A, C]
  42. [D, E, B, C, A]
  43. [E, B, C, D, A]
  44. [E, B, C, A, D]
  45. [E, B, A, D, C]
  46. [E, B, A, C, D]
  47. [E, D, C, B, A]
  48. [E, D, C, A, B]
  49. [E, D, B, C, A]
  50. [E, D, B, A, C]
  51. [E, D, A, B, C]
  52. [E, D, A, C, B]
  53. [E, A, C, D, B]
  54. [E, A, C, B, D]
  55. [E, A, B, D, C]
  56. [E, A, B, C, D]
复制代码


作者: geeksi    时间: 2016-8-2 20:20
[Java] 纯文本查看 复制代码
import java.util.Random;

public class Test2 {
        public static void main(String[] args) {
                char[] arr = {'A','B','C','D','E'};
                int count = 0;
                while(count < 5 * 5 * 5 * 5 * 5 * 5){//产生的是一个六个字符组成的字符串,如果需要产生五个字符组成的可以更改判断条件->5 * 5 * 5 * 5 * 5,j < 6 --> j < 5
                String s = "";
                        for(int j = 0;j < 6;j ++){
                                Random r = new Random();
                                int i = r.nextInt(5);
                                s = s + arr;
                        }
                        if(s.charAt(2) != 'D' && s.indexOf("CE") == -1 && s.indexOf("EC") == -1){
                                count++;
                                System.out.println(s);
                        }
                }
        }
}


作者: 刘小白    时间: 2016-8-2 20:25
cat73 发表于 2016-8-2 20:11
[mw_shl_code=java,true]import java.util.Arrays;
public final class Main {
    public static void mai ...

谢谢大神
作者: cat73    时间: 2016-8-2 20:30

算法仅供参考 0.0
这个要是丢到黑马面试之类的估计是不能用。。。
用了 Java8 的新特性 0.0
作者: 刘小白    时间: 2016-8-2 20:40
cat73 发表于 2016-8-2 20:30
算法仅供参考 0.0
这个要是丢到黑马面试之类的估计是不能用。。。
用了 Java8 的新特性 0.0 ...

你的猫不累吗?{:2_30:}
作者: cat73    时间: 2016-8-2 20:52

我就是喵呀!
作者: 刘小白    时间: 2016-8-2 21:15

那你不累吗?
作者: cat73    时间: 2016-8-2 21:47

感觉成板聊了。。。
不开网页就不会动呀!

作者: 18072727834    时间: 2016-8-2 22:13
大神  一看这题有点晕
作者: 刘小白    时间: 2016-8-2 22:26
cat73 发表于 2016-8-2 21:47
感觉成板聊了。。。
不开网页就不会动呀!

什么叫板聊,球指导
作者: qetu001212    时间: 2016-8-2 22:41
cat73 发表于 2016-8-2 20:11
[mw_shl_code=java,true]import java.util.Arrays;
public final class Main {
    public static void mai ...

大腿给我,让我抱抱~~~
作者: 13411939415    时间: 2016-8-2 23:34
只调用了String,其他的都是算法实现了,入得了法眼吗

public class Pailie {

        public static void main(String[] args) {
                char[] arr = {'A','B','C','D','E'};
               
                int i = 0;
                int count = 0;                        //进行排列的次数
                while(true) {
                        if((i + 1) < arr.length) {
                                String s = new String(arr);                        //把字符数组转换后才能字符串
                                if(s.charAt(2) != 'D' && !s.contains("CE") && !s.contains("EC")) {                //通过字符串判断D是否在第三位,C和E是否相邻
                                        System.out.println(s);                //符合条件则打印出相应的结果
                                }
                                char t = arr[i];                        //从索引0开始,将相邻的两个元素依次调换,当索引+1等于数组长度时,i=0,进行下一轮,直到排列次数达到为止
                                arr[i] = arr[i + 1];
                                arr[i + 1] = t;
                                i++;
                                count++;
                        }else {
                                i = 0;
                        }
                        if(count == jieCheng(arr.length)) {                //当所有可能全部排列完后结束循环
                                break;
                        }
                }
        }
       
        public static int jieCheng(int length) {                //求阶乘,即需要排列的次数
                int count = 1;
                for(int i = 1; i <= length; i++) {
                        count *= i;
                }
                return count;
        }

}
作者: cat73    时间: 2016-8-2 23:52
13411939415 发表于 2016-8-2 23:34
只调用了String,其他的都是算法实现了,入得了法眼吗

public class Pailie {

这算法会有重复输出呀,每个输出都重复了 6 次,实际才输出了 12 个结果。
作者: 刘小白    时间: 2016-8-3 10:30
13411939415 发表于 2016-8-2 23:34
只调用了String,其他的都是算法实现了,入得了法眼吗

public class Pailie {

我这就去试试
作者: 13411939415    时间: 2016-8-3 22:05

尴尬了,真的做错了
作者: 13411939415    时间: 2016-8-3 23:58
找到了排列的算法,递归真心看不懂,分享一下吧
public class PaiLie2 {
        public static void main(String[] args) {
                char[] arr = {'a','b','c','d'};
                pailie(arr,0);
        }
       
        public static void jiaoHuan(char[] arr,int i,int j) {
                char c = arr[i];
                arr[i] = arr[j];
                arr[j] = c;
        }
       
        public static void pailie(char[] arr,int index) {
                if(index >= arr.length) {
                        System.out.println(arr);
                        return;
                }
               
                for(int i = index; i < arr.length; i++) {
                        jiaoHuan(arr,i,index);
                        pailie(arr,index + 1);
                        jiaoHuan(arr,i,index);
                }
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2