A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘小白 中级黑马   /  2016-8-2 17:07  /  1201 人查看  /  23 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.ABCDE这五个字母,写一个类,打印出所有的排序,如:ABBCDEEDCBAA等,要求:“D”不能在第3位,“C”与“E”不能相临。

谁来救救我

23 个回复

倒序浏览
给你一种思路:用排除法
1、写出所有的组合
2、找出第三位是D的字符串,删掉
3、匹配字符串中含有“CE”,"EC"的,删掉
回复 使用道具 举报
这是学到多少天了
回复 使用道具 举报
不知道、、、、
回复 使用道具 举报
本帖最后由 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[i] == 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]
复制代码

点评

并没有  发表于 2016-8-3 00:16
表示你这里面C和E相邻了  发表于 2016-8-2 23:38
回复 使用道具 举报
[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[i];
			}
			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:45
8#

算法仅供参考 0.0
这个要是丢到黑马面试之类的估计是不能用。。。
用了 Java8 的新特性 0.0
回复 使用道具 举报
cat73 发表于 2016-8-2 20:30
算法仅供参考 0.0
这个要是丢到黑马面试之类的估计是不能用。。。
用了 Java8 的新特性 0.0 ...

你的猫不累吗?{:2_30:}
回复 使用道具 举报
cat73 黑马帝 2016-8-2 20:52:34
10#

我就是喵呀!
回复 使用道具 举报

那你不累吗?
回复 使用道具 举报
cat73 黑马帝 2016-8-2 21:47:45
12#

感觉成板聊了。。。
不开网页就不会动呀!
回复 使用道具 举报
大神  一看这题有点晕
回复 使用道具 举报
cat73 发表于 2016-8-2 21:47
感觉成板聊了。。。
不开网页就不会动呀!

什么叫板聊,球指导

点评

大概就是在论坛聊天啦 0.0  发表于 2016-8-2 23:03
回复 使用道具 举报
cat73 发表于 2016-8-2 20:11
[mw_shl_code=java,true]import java.util.Arrays;
public final class Main {
    public static void mai ...

大腿给我,让我抱抱~~~
回复 使用道具 举报
只调用了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:14
17#
13411939415 发表于 2016-8-2 23:34
只调用了String,其他的都是算法实现了,入得了法眼吗

public class Pailie {

这算法会有重复输出呀,每个输出都重复了 6 次,实际才输出了 12 个结果。
回复 使用道具 举报
13411939415 发表于 2016-8-2 23:34
只调用了String,其他的都是算法实现了,入得了法眼吗

public class Pailie {

我这就去试试
回复 使用道具 举报

尴尬了,真的做错了
回复 使用道具 举报
找到了排列的算法,递归真心看不懂,分享一下吧
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);
                }
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马