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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

哇咔咔学IT

初级黑马

  • 黑马币:31

  • 帖子:11

  • 精华:0

//编程列出一个字符串的全部字符组合情况。原始字符串中没有重复字符。
//例如:
//原始字符串是“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的内心一定是崩溃的)

13 个回复

倒序浏览
学习下。。。。。
回复 使用道具 举报
学习一下
回复 使用道具 举报
思路还不错啊
回复 使用道具 举报
学习!学习!
回复 使用道具 举报
写的很好啊
回复 使用道具 举报
加油加油加油加油
回复 使用道具 举报
写的很好
回复 使用道具 举报

多谢夸奖  (就当你是夸奖我啦 哈哈)
回复 使用道具 举报
进来看看,加油加油。
回复 使用道具 举报
Erry 中级黑马 2016-4-25 21:45:30
11#
太深奥,我没看懂
回复 使用道具 举报
更简便的做法是采用递归算法,网上倒是有,就是看不太懂。
回复 使用道具 举报
谢谢分享!!!
回复 使用道具 举报
好题,学习了,回去练练
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马