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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小太阳大开心 中级黑马   /  2014-7-26 15:45  /  1657 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小太阳大开心 于 2014-7-26 20:59 编辑

编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
有没有哪位同学可以给详解分析一下思路呢??:P

11 个回复

倒序浏览
这个听说是基础试题。。。感觉有些难度,还好我没遇到这题。。。
回复 使用道具 举报
我也遇到了,该咋弄
回复 使用道具 举报
回复 使用道具 举报
/*****************************************************************************/
先上代码:
                String str = "abc";
                char[] ch = str.toCharArray();
                for (int i = 0; i < ch.length; i++) {
                        System.out.println(ch[i]);
                        for (int j = 0; j < ch.length; j++) {
                                if(ch[i] != ch[j]){
                                        System.out.println(ch[i] + "" + ch[j]);
                                }
                                for (int j2 = 0; j2 < ch.length; j2++) {
                                        if(ch[i] != ch[j] && ch[i]!= ch[j2] && ch[j]!=ch[j2]){
                                                System.out.println(ch[i] + "" + ch[j] + ""+ch[j2]);
                                        }
                                }
                        }
                }
/*****************************************************************************/
思路:这个和排列组合的知识有关。
1.因为第一排出现了三个单字母“a“ “b” “c”
所以,第一层for循环有输出;
2.第二排是"ab" "bc" "ca" "ba" "cb" "ac"
而对于两层循环3x3=9,少了三个aa,bb,cc。所以用一个if判断是否相等
3.三个的排列去掉重复的就是六个,A33,。高中学的排列都不太记得了
---------------------------------------------------------------------------
不过我这个格式是乱的
回复 使用道具 举报
1、使用TreeSet集合,因为得到的元素对象不可重复
2、递归思想

以上2种必须掌握才能解题,不然字符串一多就挂了,例题只是简单的三个字符
回复 使用道具 举报
public class Test{
        public static void main(String[] args) {
                print("abc".toCharArray(),"");
        }
       
        public static void print(char[] chr,String deleteStr){
                for(int i = 0;i<chr.length;i++){
                        String delStr = deleteStr;
                        for(int j = 0;j<chr.length;j++){
                                if(j == i)continue;//chr[i] == chr[j]没必要比较了.
                                System.out.println(delStr + Character.toString(chr[i]) + Character.toString(chr[j]));
                        }
                        delStr += Character.toString(chr[i]);
                        char[] deleteChar = deleteCurrentChar(chr,i);
                        print(deleteChar,delStr);
                }
        }
       
        public static char[] deleteCurrentChar(char[] chr,int idx){//删除当前位字母.
                char[] chrResult = new char[chr.length - 1];//去掉一个长度
                int j = 0;
                for(int i = 0;i<chr.length;i++,j++){
                        if(i == idx){
                                if(i == chr.length - 1){
                                        break;
                                }
                                i++;
                                chrResult[j] = chr[i];
                                continue;
                                }
                        chrResult[j] = chr[i];
                }
                return chrResult;
        }
}
回复 使用道具 举报
star5603 发表于 2014-7-26 16:23
这个听说是基础试题。。。感觉有些难度,还好我没遇到这题。。。

你准备进哪一期啊,同学
回复 使用道具 举报
黑马-蒋振军 发表于 2014-7-26 17:13
http://bbs.itheima.com/thread-132465-1-1.html

谢谢哦,学习啦
回复 使用道具 举报
小太阳大开心 发表于 2014-7-26 20:23
你准备进哪一期啊,同学

42,你呢
回复 使用道具 举报
我咋觉得这题好像前几天才看过...
似乎用递归可以做
回复 使用道具 举报
收着                        
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马