黑马程序员技术交流社区

标题: 这个题,怎么没有思路啊? [打印本页]

作者: 小太阳大开心    时间: 2014-7-26 15:45
标题: 这个题,怎么没有思路啊?
本帖最后由 小太阳大开心 于 2014-7-26 20:59 编辑

编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
有没有哪位同学可以给详解分析一下思路呢??:P
作者: star5603    时间: 2014-7-26 16:23
这个听说是基础试题。。。感觉有些难度,还好我没遇到这题。。。
作者: lcl    时间: 2014-7-26 16:57
我也遇到了,该咋弄
作者: 黑马-蒋振军    时间: 2014-7-26 17:13
http://bbs.itheima.com/thread-132465-1-1.html
作者: 洛漠O_o    时间: 2014-7-26 18:14
/*****************************************************************************/
先上代码:
                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,。高中学的排列都不太记得了
---------------------------------------------------------------------------
不过我这个格式是乱的

作者: Jpor    时间: 2014-7-26 18:20
1、使用TreeSet集合,因为得到的元素对象不可重复
2、递归思想

以上2种必须掌握才能解题,不然字符串一多就挂了,例题只是简单的三个字符
作者: 導ぷ仙″兲蕐    时间: 2014-7-26 18:37
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;
        }
}
作者: 小太阳大开心    时间: 2014-7-26 20:23
star5603 发表于 2014-7-26 16:23
这个听说是基础试题。。。感觉有些难度,还好我没遇到这题。。。

你准备进哪一期啊,同学
作者: 小太阳大开心    时间: 2014-7-26 20:48
黑马-蒋振军 发表于 2014-7-26 17:13
http://bbs.itheima.com/thread-132465-1-1.html

谢谢哦,学习啦
作者: star5603    时间: 2014-7-26 21:25
小太阳大开心 发表于 2014-7-26 20:23
你准备进哪一期啊,同学

42,你呢
作者: 柠萌不    时间: 2014-7-26 21:41
我咋觉得这题好像前几天才看过...
似乎用递归可以做
作者: ws484664    时间: 2014-7-26 23:30
收着                        




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