黑马程序员技术交流社区

标题: 前两天一同学问我的题 觉得值得与大家分享一下 [打印本页]

作者: 哇咔咔学IT    时间: 2016-4-24 12:07
标题: 前两天一同学问我的题 觉得值得与大家分享一下
//编程列出一个字符串的全部字符组合情况。原始字符串中没有重复字符。
//例如:
//原始字符串是“abc”,打印得到下列所有组合情况:
//“a” “b” “c”
//"ab" "ac" "ba" "bc" "ca"  "cb"
//"abc"  "acb"  "bac" "bca"  "cab" "cba"

package test;

import java.util.TreeSet;

public class Test19 {

        /**
         * @param args
         */
/*        思路:(个人思路,其实做法蛮多(主要指第三步),但我懒得去实验了,做出来就行啦  哇咔咔)
*                 1.获取字符串中字符元素(通过char数组)
*                 2.遍历字符串中单个字符(遍历char数组 就好啦)
*                 3.通过for循环 遍历 两个字符的组合情况 到 字符串string.length()个字符的组合情况 (
*                         如遍历count个字符的组合情况:
*                         (1)获取count个字符的组合情况 的 个数x
*                         (2)用char[] 中字符 组合出 x个 不重复的 count个字符的字符串 (通过random随机组合放入TreeSet中:运用TreeSet的特点 不重复 还能                                                                                                                                     有序输出 )
*                 )
*/
       
        public static void main(String[] args) {
               
//                1.获取字符串中字符元素(通过char数组)
               
                String s = "abc";
                char[] ch = s.toCharArray();
               
//                2.遍历字符串中单个字符(遍历char数组 就好啦)
               
                for (char c : ch) {
                        System.out.println(c);
                }
               
//                3.通过for循环 遍历 两个字符的组合情况 到 字符串string.length()个字符的组合情况
               
                for (int count = 2; count <= ch.length; count++) {
                       
//                        用char[] 中字符 组合出 x个 不重复的 count个字符的字符串
                       
                        TreeSet<String> set = new TreeSet<>();                       
                        while(set.size() < getNum(count,ch.length)){
                                StringBuffer sb = new StringBuffer();
                                for (int i = 0; i < count;) {                       
                                        String s1 = ((Character)(ch[(int) (Math.random() * ch.length)])).toString();
                                        if(!sb.toString().contains(s1)) {
                                                sb.append(s1);
                                                i++;
                                        }                                                                                                                                                       
                                }
                                set.add(sb.toString());
                        }
                        System.out.println(set);
                }
        }
       
//        获取count个字符的组合情况 的 个数x(例如:获取3个元素中 2个元素 有序排列组合的个数 x=3*2=6
//                                                获取4个元素中3个元素有序排列组合的个数 x=4*3*2=24)
       
        private static int getNum(int count, int length) {
                int x = 1;
                for (int i = length - count + 1; i <= length; i++) {
                        x = x * i;
                }
                return x;
        }
}


欢迎大家给出更好更简便的做法哦 (感觉我在这用random cpu的内心一定是崩溃的)


作者: 小红花    时间: 2016-4-24 12:26
学习下。。。。。
作者: 林明辉    时间: 2016-4-24 12:29
学习一下
作者: 昵称又被占用    时间: 2016-4-24 19:05
思路还不错啊
作者: itheima2016    时间: 2016-4-24 19:59
学习!学习!
作者: tongtian    时间: 2016-4-24 20:57
加油加油加油加油
作者: 菊花爆满山    时间: 2016-4-24 21:14
写的很好
作者: 哇咔咔学IT    时间: 2016-4-24 22:01
昵称又被占用 发表于 2016-4-24 19:05
思路还不错啊

多谢夸奖  (就当你是夸奖我啦 哈哈)
作者: AllenTse    时间: 2016-4-25 10:21
进来看看,加油加油。
作者: Erry    时间: 2016-4-25 21:45
太深奥,我没看懂
作者: 小海龙    时间: 2016-4-25 22:28
更简便的做法是采用递归算法,网上倒是有,就是看不太懂。
作者: 纪先森    时间: 2016-4-25 22:34
谢谢分享!!!
作者: 冰刃    时间: 2016-4-25 22:39
好题,学习了,回去练练




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