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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 VIP1108210117 于 2015-6-11 23:30 编辑

之前在做入学测试题时,在论坛也看到过一些解法,http://bbs.itheima.com/thread-145369-1-1.html
但是在输入的字符串中包含程序中所用的字符串分割符(此程序中分割符为逗号)的情况下,
如输入“a,c”时,输出结果就不再是所输字符串的全字符组合情况了。
我的思路是,可以通过计算字符排列种类确定新一行的数组长度,代码如下:
package com.itheima;

import java.lang.reflect.Array;
import java.util.Scanner;

/**
* 7、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
* 原始字符串是"abc",打印得到下列所有组合情况:
* "a" "b" "c"
* "ab" "bc" "ca" "ba" "cb" "ac"
* "abc" "acb" "bac" "bca" "cab" "cba"
*
* @author Administrator
*
*/
public class Test7 {
        public static void main(String[] args) {
                System.out.println("请输入一个字符串:");
                //实例化Scanner工具类,获取封装后的标准输入流
                Scanner input = new Scanner(System.in);
                String str = input.nextLine();
                input.close();
                showStr(str);
        }
        /**
         * 计算并输入字符串的全字符组合情况
         * @param str
         */
        public static void showStr(String str) {
                char[] array = str.toCharArray();
                String[]strs=new String[array.length];
                for (int i = 0; i < array.length; i++) {
                        strs=""+array;
                }//构建初始字符串元素数组
                printObj(strs);//输出第一行排列情况
                for (int i = 1; i < array.length; i++) {                        
                        //getAmn方法用于计算第(i+1)行字符排列情况的总数
                        strs=getNewStrs(array,strs,getAmn(array.length,i+1));
                        printObj(strs);//输出第(i+1)行排列情况
                }
               
        }
        /**
         * 计算字符排列情况的总数
         * 排列,就是指从给定个数的元素中取出指定个数的元素进行排序
         * @param length 待排列字符的总数
         * @param i 待排列字符的个数
         * @return
         */
        private static int getAmn(int length, int i) {
                //System.out.print("A(" + length + "," + i + ")=");
                int sum = 1;
                while (i != 0) {
                        sum *= (length--);
                        i--;
                }
                //System.out.println(sum);
                return sum;
        }
        /**
         * 根据前一行的组合,获取新组合
         * @param array
         * @param strs
         * @return
         */
        private static String[] getNewStrs(char[] array, String[] strs,int sum) {
                String[]newStrs=new String[sum];
                int count=0;
                for (int i = 0; i < strs.length; i++) {
                        for (int j = 0; j < array.length; j++) {
                                if(strs.indexOf(array[j])<0){
                                        newStrs[count++]=strs+array[j];
                                }
                        }
                }
                return newStrs;
        }

        /**
         * 输出指定内容
         * @param obj
         */
        private static void printObj(Object obj) {
                Class<? extends Object> clazz=obj.getClass();
                if(clazz.isArray()){
                        int len=Array.getLength(obj);
                        for(int i=0;i<len;i++)
                                System.out.print("\""+Array.get(obj, i)+"\""+"\t");
                }else{
                        System.out.println(obj);
                }
                System.out.println();
        }

}


15 个回复

倒序浏览
本帖最后由 VIP1108210117 于 2015-6-11 23:32 编辑

用字符分割的方式求解时,输入“a,b”的时候测试结如下:
"a"",""c"
"a""""ac""""a""""c""ca""c"
"a""""ac""a""""""c""ac""""a""""""c""a""""ac""a""""""c""ca""c""""ca""""ca""c"
回复 使用道具 举报
本帖最后由 VIP1108210117 于 2015-6-11 23:32 编辑

我的程序测试结果:
请输入一个字符串:
a,c
"a"        ","        "c"        
"a,"        "ac"        ",a"        ",c"        "ca"        "c,"        
"a,c"        "ac,"        ",ac"        ",ca"        "ca,"        "c,a"
回复 使用道具 举报
貌似好高深啊
回复 使用道具 举报
厉害学习了
回复 使用道具 举报
zyjszl 来自手机 初级黑马 2015-6-12 11:11:24
地板
我只是混眼熟不知道有没有十五字
回复 使用道具 举报
zyjszl 来自手机 初级黑马 2015-6-12 11:12:37
7#
厉害厉害啊
回复 使用道具 举报

谢谢支持
回复 使用道具 举报

你都10个技术分啦
回复 使用道具 举报
为了技术分,大家也都够拼的
回复 使用道具 举报
这个好专业的样子,这位同学好厉害啊  ,崇拜ing
回复 使用道具 举报
hi潘 中级黑马 2015-6-12 13:41:38
12#
NB,好屌的样子..............
回复 使用道具 举报
很厉害,这道题目我看了很多写法,你的应该我目前看到最优的。
不过你没有测试过么,很多地方都忘记加角标了。
回复 使用道具 举报
分享快乐
回复 使用道具 举报
正在做这道题,参考参考
回复 使用道具 举报
anuo 中级黑马 2015-12-2 09:11:35
16#
楼主的书写风格不错,我要学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马