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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

5黑马币
用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
从网上找过写答案,但是结识的都不清楚,请大神来个详细解答的。谢谢了

最佳答案

查看完整内容

具体代码如下: package 考试第六题; import java.util.ArrayList; import java.util.List; public class Demo { public static String[] diGui(String s) { List list = new ArrayList(); char[] chs = s.toCharArray(); //StringBuilder sb = new StringBuilder(); if (s.length() == 1) { return new String[] { s }; } for (char ch : chs) { String result = s.substring(0, s.indexOf(ch)) + s.su ...

评分

参与人数 1黑马币 +1 收起 理由
watl1989 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
具体代码如下:
package 考试第六题;

import java.util.ArrayList;
import java.util.List;

public class Demo {
        public static String[] diGui(String s) {
                List<String> list = new ArrayList<String>();
                char[] chs = s.toCharArray();
                //StringBuilder sb = new StringBuilder();

                if (s.length() == 1) {
                        return new String[] { s };
                }
                for (char ch : chs) {
                        String result = s.substring(0, s.indexOf(ch))
                                        + s.substring(s.indexOf(ch) + 1, s.length());
                        for (String str : diGui(result)) {
                                String r = ch + str;
                                list.add(r);
                        }
                        // sb.append(ch).append(diGui(result));
                }
                return list.toArray(new String[0]);
        }

        public static void main(String[] args) {
                // System.out.println(diGui("122345").length);
                ArrayList<String> al = new ArrayList<>();

                for (String str : diGui("122345")) {
                        al.add(str);
                       
                       
                }
                ArrayList<String> al2=new ArrayList<>();
                for (String str : al) {
                        if (str.indexOf('4') != 3 && !str.contains("35")
                                        &&! str.contains("53")) {
                                al2.add(str);
                        }
                }
                for(String s:al2){
                        System.out.println(s);
                }
                System.out.println("集合的长度为:"+al2.size());
        }
}

评分

参与人数 1黑马币 +10 收起 理由
DAN66 + 10 赞一个!

查看全部评分

回复 使用道具 举报
兄弟 一点点给你分析 给你打的代码,如果帮你解决了问题 麻烦给点黑马币. 拼命赚技术分中...
回复 使用道具 举报
君子无醉 发表于 2015-7-7 16:54
兄弟 一点点给你分析 给你打的代码,如果帮你解决了问题 麻烦给点黑马币. 拼命赚技术分中... ...

兄弟  有没有注释 能不能写下思路。

点评

用递归 你先假设有三个数字 123,然后递归传进去,第一次递归获取 1或2或3,往第二次递归传12或23或13,第二次递归往第三次递归传1或2或3。。返回值返回一个String数组 然后遍历拼接这个数组 你可以想象一个树状图   发表于 2015-7-8 09:30
回复 使用道具 举报
还有没有人
回复 使用道具 举报
哈哈 来看看 顺便学习
回复 使用道具 举报
有两种思路:先把这六个数存到一个字符数组。
第一种是最直接的思路,挑6次,判断条件是每次挑的数不是同一个位置就行,这样就用到6次嵌套for循环,每次判断下是否和上面的for循环得到的数是否相同,可以直接得到结果;至于说结果里两个2会出现重复结果的问题,只要把得到的排列字符串存到TreeSet里,为这个集合定义一下equals方法就行,重复的就会被排除。
这种思路改善下代码就是递归思路:即每次取到一个数后,将去掉这个数的子字符串传下去,直到子字符串长度为0。
第二种思路是先直接用全排列,即每个位置都可以用所有数。然后再将结果根据要求来筛选:如结果必须包含12345(用contains方法),结果必须包含两个2(用正则表达式或打散成字符后检查是否有两个2)。对于两个2导致的结果重复问题也可以用上面说的集合的equals方法来排除。
我只试了下第一种思路(还没有存进集合进行两个2导致的重复结果的筛选):代码如下
  1. public class PaiXu {

  2.         public static void main(String[] args) {
  3.                 char[] base={'1','2','2','3','4','5'};
  4.                 int len=base.length;
  5.                 char[] aim=new char[len];
  6.                
  7.                
  8. for(int i1=0;i1<len;i1++){
  9.                         aim[0]=base[i1];
  10.                         for(int i2=0;i2<len;i2++){
  11.                                 if(i2!=i1){
  12.                                         aim[1]=base[i2];
  13.                                         for(int i3=0;i3<len;i3++){
  14.                                                 if((i3!=i1)&&(i3!=i2)){
  15.                                                         aim[2]=base[i3];
  16.                                                         for(int i4=0;i4<len;i4++){
  17.                                                                 if((i4!=i3)&&(i4!=i2)&&(i4!=i1)){
  18.                                                                         aim[3]=base[i4];
  19.                                                                         for(int i5=0;i5<len;i5++){
  20.                                                                                 if((i5!=i4)&&(i5!=i3)&&(i5!=i2)&&(i5!=i1)){
  21.                                                                                         aim[4]=base[i5];
  22.                                                                                         for(int i6=0;i6<len;i6++){
  23.                                                                                                 if((i6!=i5)&&(i6!=i4)&&(i6!=i3)&&(i6!=i2)&&(i6!=i1)){
  24.                                                                                                         aim[5]=base[i6];
  25.                                                                                                         System.out.println(new String(aim));
  26.                                                                                                 }
  27.                                                                                         }
  28.                                                                                 }
  29.                                                                                
  30.                                                                         }
  31.                                                                 }
  32.                                                                
  33.                                                         }
  34.                                                 }
  35.                                                
  36.                                         }
  37.                                 }
  38.                                
  39.                         }
  40.                 }

  41.         }
  42. }
复制代码

回复 使用道具 举报
import java.util.ArrayList; import java.util.List; public class Demo { public static String[] diGui(String s) { List list = new ArrayList(); char[] chs = s.toCharArray(); //StringBuilder sb = new StringBuilder(); if (s.length() == 1) { return new String[] { s }; } for (char ch : chs) { String result = s.substring(0, s.indexOf(ch)) + s.su ...
回复 使用道具 举报
不知道如何写
回复 使用道具 举报
过来看一下,顺便也学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马