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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

斗神_

初级黑马

  • 黑马币:12

  • 帖子:23

  • 精华:0

© 斗神_ 初级黑马   /  2014-10-15 11:05  /  7086 人查看  /  21 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如(这只是个特例):
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"

最佳答案

查看完整内容

同学你这样可不好哟,这个不是入学考试的题么。。。。 给你看下我当时提交的答案吧 第六题: 6、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如: 原始字符串是"abc",打印得到下列所有组合情况: "a" "b" "c" "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" "bca" "cab" "cba" 答: 思路: 1、本题反复的代码在于,判断还剩几个字母没有写,写进去,一直在重复动作,所以考虑用递归 ...

21 个回复

倒序浏览
同学你这样可不好哟,这个不是入学考试的题么。。。。
给你看下我当时提交的答案吧
第六题:        6、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
                        原始字符串是"abc",打印得到下列所有组合情况:
                        "a" "b" "c"
                        "ab" "bc" "ca" "ba" "cb" "ac"
                        "abc" "acb" "bac" "bca" "cab" "cba"

        答:        思路:
                        1、本题反复的代码在于,判断还剩几个字母没有写,写进去,一直在重复动作,所以考虑用递归,因为要考虑是否包含已有字母,所以用集合作容器
                        2、递归负责做:清空集合,判断哪个没有写,写进集合,打印集合。递归停止标识为不存在没写过的字符,就退出递归
                        3、主函数调用递归函数,给递归一个空的集合。
                        步骤:
                        1、主函数定义一个空集合,将集合传给递归函数
                        2、递归从第一位起开始判断是否已在集合中,不在就写入,存在就不写,继续。用for循环作为递归函数位数的指针,使位数前进
                        3、定义一个打印函数,递归每在集合中写入一个数字,就打印一次
                        import java.util.*;
                        public class d2
                        {
                                static char[] chars="abcd".toCharArray();
                                public static void main(String[] args)
                                {
                                        ArrayList<Integer> list = new ArrayList<Integer>();
                                        play(list);
                                }
                                static void play(List<Integer> list)
                                {
                                        for (int i=0;i<chars.length ;i++ )
                                        {
                                                if(!list.contains(i))
                                                {
                                                        ArrayList<Integer> temp = new ArrayList<Integer>(list);
                                                        temp.add(i);
                                                        show(temp);
                                                        play(temp);
                                                }
                                        }
                                }
                                static void show(ArrayList<Integer> list)
                                {
                                        for(Integer s : list)
                                                System.out.print(chars[s]+"");
                                        System.out.println();

                                }       
                        }
回复 使用道具 举报
没有人会么?~~~
回复 使用道具 举报
  1. public class Traversal {

  2.         public static void main(String[] args) {
  3.                 new Traversal().traversal('a', 'b', 'c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z');
  4.         }


  5.         public void traversal(Character... cs) {
  6.                 List<Character> o = new LinkedList<Character>(Arrays.asList(cs));
  7.                 List<Character> f = new LinkedList<Character>();

  8.                 traversal_(o, f);
  9.         }

  10.         /**
  11.          * @param o2  未使用的元素的集合
  12.          * @param f2 以使用的元素的集合
  13.          */
  14.         private void traversal_(List<Character> o2, List<Character> f2) {
  15.                 println(f2);
  16.                 for (int i = 0; i < o2.size(); i++) {
  17.                         LinkedList<Character> o = new LinkedList<Character>(o2);
  18.                         LinkedList<Character> f = new LinkedList<Character>(f2);

  19.                         f.add(o.remove(i));
  20.                         traversal_(o, f);
  21.                 }
  22.         }

  23.         /**
  24.          * 校验并输出结果
  25.          */
  26.         public void println(List<Character> f2) {
  27.                 if (f2.size() == 0) {
  28.                         return;
  29.                 }
  30.                 char[] cs = new char[f2.size()];
  31.                 int i = 0;
  32.                 for (char c : f2) {
  33.                         cs[i] = c;
  34.                         i++;
  35.                 }

  36.                 System.out.println(new String(cs));

  37.         }
  38. }
复制代码
回复 使用道具 举报
public class StringListThree {
       
        public static void main(String[] args) {
                //传入操作对象,一个字符串
                String str = "abcdefghi";
/*                int len = str.length();
                //字符串转为char[]数组
                char[] ch = str.toCharArray();
               
                TreeSet<String> ts = new TreeSet<>();
                //将字符串每个字符添加进TreeSet<String>
                for(int i=0;i<len;i++){
                        ts.add(String.valueOf(str.charAt(i)));
                }*/
                //做递归运算,次数为操作对象字符串的长度-1
/*                for(int i=1;i<len;i++){
                        addElements(ts,ch);
                }*/
                TreeSet<String> ts = addElementsLast(str);
               
                for(String t:ts){
                        System.out.println(t);
                }
                System.out.println(ts.size());       
        }
        //将原来的方法优化
        public static TreeSet<String> addElementsLast(String str){
               
                int len = str.length();
                char[] ch = str.toCharArray();
               
                TreeSet<String> ts = new TreeSet<>();
                for(int i=0;i<len;i++){
                        ts.add(String.valueOf(str.charAt(i)));
                }

                for(int i=1;i<len;i++){
                        int index = 0;
                       
                        TreeSet<String> tss = new TreeSet<>();
                       
                        for(String t:ts){
                                for(int x=0;x<len;x++){
                                        if(t.length() == i){
                                               
                                                index = t.indexOf(ch[x]);
                                                if(index == -1)
                                                        tss.add(t+ch[x]);
                                        }
                                }
                        }
                       
                        ts.addAll(tss);
                }
                return ts;
        }
}
回复 使用道具 举报
二楼 代码没看懂
回复 使用道具 举报
怎么不能回复
回复 使用道具 举报
http://blog.sina.com.cn/s/blog_1351158110102v302.html这里看看吧
回复 使用道具 举报

分给的太少了啊, 先前我在这个模块提交了很多代码,但是楼主都放鸽子了 哎   
回复 使用道具 举报
我需要的币少,加我QQ我详细给您解答,主要还是其中的一个递归难点qq:6674784
回复 使用道具 举报
void 中级黑马 2014-10-21 09:35:33
11#
  1. import java.util.Scanner;

  2. public class Test {

  3.         public static void main(String[] args) {
  4.                 System.out.println("请输入一个字符串");
  5.                 Scanner in = new Scanner(System.in);
  6.                 String str = in.nextLine();
  7.                 System.out.println(str);
  8.                 int length = str.length() - 1;
  9.                 System.out.println(length);
  10.                 for (int i = length; i >= 0; i--) {
  11.                         for (int j = 0; j < i; j++) {

  12.                                 System.out.print(String.valueOf(str.charAt(i))
  13.                                                 + String.valueOf(str.charAt(j)) + "    ");
  14.                         }
  15.                         System.out.println();
  16.                 }
  17.         }
  18. }
复制代码
回复 使用道具 举报
void 中级黑马 2014-10-21 09:37:34
12#

运行结果:
请输入一个字符串
abcd
abcd
3//3为长度-1
da    db    dc   
ca    cb   
ba   
回复 使用道具 举报
这片代码绝对能运行成功,并且结果正确:
  1. package test;

  2. import java.util.Random;

  3. /**
  4. * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如(这只是个特例):
  5. * 原始字符串是"abc",打印得到下列所有组合情况:
  6. * "a" "b" "c"
  7. * "ab" "bc" "ca" "ba" "cb" "ac"
  8. * "abc" "acb" "bac" "bca" "cab" "cba"
  9. *
  10. * @author live-dream
  11. *
  12. */
  13. public class Test003 {
  14.        
  15.         public static void main(String[] args){
  16.                 String s = "abcd";
  17.                 int n = s.length();
  18.                 int cur = 0;
  19.                 int positionNumber = 0;
  20.                
  21.                 for(int i=1; i<=n; i++){
  22.                         int denominator = 1;
  23.                         for(int j=1; j<=n-i; j++){
  24.                                 denominator *= j;
  25.                         }

  26.                         for(int k=0; k<s.length(); k++){
  27.                                 int[][] ps = getPermutation(s.length(),k,n,i);
  28.                                 for(int c=0; c<ps.length; c++){
  29.                                         print(s,ps[c]);
  30.                                 }
  31.                         }
  32.                         System.out.println();
  33.                 }
  34.         }
  35.        
  36.         public static int[][] getPermutation(int len, int k,int n,int r){
  37.                 int positionNumber = getPositionNumber(n-1,r-1);
  38.                 int[][] ps = new int[positionNumber][r];
  39.                 int[] order = new int[len];
  40.                
  41.                 Random random = new Random();
  42.                
  43.                 for(int c=0; c<ps.length; c++){
  44.                         int[] permutation = new int[r];
  45.                         permutation[0] = k;
  46.                        
  47.                         for(int i=1; i<r; i++){
  48.                                 int randomNum = random.nextInt(n);
  49.                                         boolean ok = saveNoRepeat(permutation,i,randomNum);
  50.                                         if(!ok)
  51.                                                 i--;
  52.                         }
  53.                        
  54.                         boolean ok = false;
  55.                         for(int j=0; j<c; j++){
  56.                                 ok = false;
  57.                                 for(int p=0; p<ps[j].length; p++){
  58.                                         if(ps[j][p]!=permutation[p])
  59.                                                 ok = true;
  60.                                 }
  61.                                 if(!ok)
  62.                                         break;
  63.                         }
  64.                        
  65.                         if(c==0)
  66.                                 ps[c] = permutation;
  67.                         if(ok){
  68.                                 ps[c] = permutation;
  69.                         }else if(!ok && c>0){
  70.                                 c--;
  71.                         }
  72.                 }
  73.                
  74.                 return ps;
  75.         }
  76.        
  77.         public static int getPositionNumber(int n, int r){
  78.                 int positionNumber = 0;
  79.                 int molecule = 1;
  80.                 int denominator = 1;
  81.                
  82.                 for(int i=1; i<=n; i++){
  83.                         molecule *= i;
  84.                 }
  85.                 for(int i=1; i<=n-r; i++){
  86.                         denominator *= i;
  87.                 }
  88.                 positionNumber = molecule/denominator;

  89.                 return positionNumber;
  90.         }
  91.        
  92.         public static boolean saveNoRepeat(int[] arr, int index,int value){
  93.                 boolean noRepeat = true;
  94.                 for(int i=0; i<index; i++){
  95.                         if(arr[i]==value){
  96.                                 noRepeat = false;
  97.                                 break;
  98.                         }
  99.                 }
  100.                 if(noRepeat)
  101.                         arr[index] = value;
  102.                 return noRepeat;
  103.         }
  104.        
  105.         public static void print(String s, int[] permutation){
  106.                 String test = "";
  107.                 for(int c=0; c<permutation.length; c++){
  108.                         test += s.charAt(permutation[c]);
  109.                 }
  110.                 System.out.print("\""+test+"\"");
  111.         }

  112. }
复制代码
回复 使用道具 举报
还没有解决吗?
回复 使用道具 举报
大神好多啊!!!
回复 使用道具 举报
好题目呀:lol
回复 使用道具 举报
过来学习一下
回复 使用道具 举报
二货哈士奇 发表于 2014-10-30 16:29
同学你这样可不好哟,这个不是入学考试的题么。。。。
给你看下我当时提交的答案吧
第六题:        6、 编程列出 ...

入学考试题,考这么难啊,菜鸟表示压力山大啊
回复 使用道具 举报
import java.util.Scanner;
import java.util.Arrays;
class GetStr {
    public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);
        System.out.println("请输入欲处理的字符串:");
        String s=scanner.nextLine();
        if(s.equals("")) s="baedyc";
        char[] temp=new char[s.length()];
        for(int i=0;i<s.length();i++)//将字符串分解并保存到数组
            temp[i]=s.charAt(i);
        Arrays.sort(temp);//数组排序
        if(s.length()>=1) result1(temp);
        if(s.length()>=2) result2(temp);
        if(s.length()>=3) result3(temp);
        if(s.length()>=4) result4(temp);
        if(s.length()>=5) result5(temp);
        if(s.length()>=6) result6(temp);
        if(s.length()>=7) result7(temp);
    }
    public static void result1(char[] str)//打印一级组合
    {
        System.out.println("一级组合:");
        String temp="";
        for(int i=0;i<str.length;i++)
                temp=temp+"\""+str[i]+"\" ";
        System.out.println(temp);
    }
    public static void result2(char[] str)//打印二级组合
    {
        System.out.println("二级组合:");
        String temp="";
        for(int i=0;i<str.length-1;i++)
            for(int j=i+1;j<str.length;j++)
                temp=temp+"\""+str[i]+str[j]+"\" ";
        System.out.println(temp);
    }
    public static void result3(char[] str)//打印三级组合
    {
        System.out.println("三级组合:");
        String temp="";
        for(int i=0;i<str.length-2;i++)
            for(int j=i+1;j<str.length-1;j++)
                for(int k=j+1;k<str.length;k++)
                    temp=temp+"\""+str[i]+str[j]+str[k]+"\" ";
        System.out.println(temp);
    }
    public static void result4(char[] str)//打印四级组合
    {
        System.out.println("四级组合:");
        String temp="";
        for(int i=0;i<str.length-3;i++)
            for(int j=i+1;j<str.length-2;j++)
                for(int k=j+1;k<str.length-1;k++)
                    for(int l=k+1;l<str.length;l++)
                        temp=temp+"\""+str[i]+str[j]+str[k]+str[l]+"\" ";
        System.out.println(temp);
    }
    public static void result5(char[] str)//打印五级组合
    {
        System.out.println("五级组合:");
        String temp="";
        for(int i=0;i<str.length-4;i++)
            for(int j=i+1;j<str.length-3;j++)
                for(int k=j+1;k<str.length-2;k++)
                    for(int l=k+1;l<str.length-1;l++)
                        for(int m=l+1;m<str.length;m++)
                            temp=temp+"\""+str[i]+str[j]+str[k]+str[l]+str[m]+"\" ";
        System.out.println(temp);
    }
    public static void result6(char[] str)//打印六级组合
    {
        System.out.println("六级组合:");
        String temp="";
        for(int i=0;i<str.length-5;i++)
            for(int j=i+1;j<str.length-4;j++)
                for(int k=j+1;k<str.length-3;k++)
                    for(int l=k+1;l<str.length-2;l++)
                        for(int m=l+1;m<str.length-1;m++)
                            for(int n=m+1;n<str.length;n++)
                                temp=temp+"\""+str[i]+str[j]+str[k]+str[l]+str[m]+str[n]+"\" ";
        System.out.println(temp);
    }
    public static void result7(char[] str)//打印七级组合
    {
        System.out.println("七级组合:");
        String temp="";
        for(int i=0;i<str.length-6;i++)
            for(int j=i+1;j<str.length-5;j++)
                for(int k=j+1;k<str.length-4;k++)
                    for(int l=k+1;l<str.length-3;l++)
                        for(int m=l+1;m<str.length-2;m++)
                            for(int n=m+1;n<str.length-1;n++)
                                for(int o=n+1;o<str.length;o++)
                            temp=temp+"\""+str[i]+str[j]+str[k]+str[l]+str[m]+str[n]+str[o]+"\" ";
        System.out.println(temp);
    }
}

getstr.zip

861 Bytes, 下载次数: 822

回复 使用道具 举报
private static LinkedList<char[]> recursionSub ( int ind, int start )        {                start++;                if (start > count - 1)                {                        return null;                }                for ( indexs[start] = 0; indexs[start] < len; indexs[start]++ )                {                        recursionSub (0, start);                        if (start == count - 1)                        {                                char[] temp = new char[count];                                for ( int i = count - 1; i >= 0; i-- )                                {                                        temp[start - i] = array[indexs[start - i]];                                }                                boolean flag = true;                                for ( int i = 0; i < temp.length; i++ )                                {                                        for ( int j = i+1; j < temp.length; j++ )                                        {                                                if (temp[i] == temp[j])                                                {                                                        flag = false;                                                        break;                                                }                                        }                                }                                if (flag)                                {                                        list.add (temp);                                }                        }                }                return list;        }
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马