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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sofeel 中级黑马   /  2015-2-21 20:42  /  1193 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家帮帮忙!
原题如下:
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
                "a" "b" "c"
                "ab" "bc" "ca" "ba" "cb" "ac"
                "abc" "acb" "bac" "bca" "cab" "cba"

想了很久,也写不出通用而优雅的方法。用3层for循环可以实现,但那样毫无意义。我想:
当添加第1个字符时,下一个字符有2个位置可选;
当添加第2个字符时,下一个字符有3个位置可选;
.....
当添加第n-1个字符时,第n个字符有n+1个位置可选;

可写不出代码来,请大家帮帮忙。

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 加油

查看全部评分

5 个回复

倒序浏览
本帖最后由 coolmiao13 于 2015-2-21 22:21 编辑
  1. //挺锻炼思路的,每行都有注释,先百度,找了好几个版本,整理好之后发出来了,我自己看看能不能有优化的空间。
  2. //原版地址:http://bbs.itheima.com/thread-145369-1-1.html
  3. //声明一下版权,做人不能不厚道。
  4. package ch01;

  5. public class LieJu {
  6.         public static void main(String[] args) {
  7.                 //调用方法,传入字符串
  8.                 zuHe.show("ab");
  9.         }
  10. }
  11. class zuHe {
  12.         //编写方法,接收字符串
  13.         public static void show(String str){
  14.                 //将原始字符串转成原始字符数组
  15.                 char[] chs=str.toCharArray();
  16.                 //获得原始字符串数组,即每个字符串只有一个字符
  17.                 String[] strs=chsToStrs(chs);
  18.                 //按指定格式输出原始字符串数组,即单个字符的组合情况
  19.                 printString(strs);
  20.                 //x为每行单个字符串的长度,第一行已经输出,所以从2开始,最长为原始字符串长度,循环输出每行组合
  21.                 for(int x = 2;x<=str.length();x++){
  22.                         //调用方法,传入 原始字符数组 和 前一次的字符串数组,获得新的字符串数组
  23.                         strs=addChar(chs,strs);
  24.                         //按指定格式输出新的字符串数组
  25.                         printString(strs);
  26.                 }
  27.         }
  28.         //定义方法,接收 原始字符数组 和 前一次的字符串数组,并返回新字符串数组
  29.         public static String[] addChar(char[] chs,String[] oldStrs){
  30.                 //因为新字符数组长度暂时无法确定,也为了转换方便,所以使用StringBuilder来接收每个新字符串
  31.                 StringBuilder sb=new StringBuilder();
  32.                 //定义新字符串数组               
  33.                 String[] newStrs=null;
  34.                 //外循环,遍历每个字符串数组
  35.                 for(int x=0;x<oldStrs.length;x++){
  36.                         //内循环,遍历每个原始字符,将每个字符串把每个不同字符都单独添加一次
  37.                         for(int y=0;y<chs.length;y++){
  38.                                 //判断字符串是否包含该字符,通过indexOf()的返回值>=0来确定已包含
  39.                                 if(oldStrs[x].indexOf(chs[y])>=0)
  40.                                         //已包含该字符,则不操作,继续下次循环
  41.                                         continue;
  42.                                 //不包含该字符,则添加该字符
  43.                                 String s=oldStrs[x]+chs[y];
  44.                                 //添加新字符串到StringBuilder对象并用','隔开
  45.                                 sb.append(s).append(',');
  46.                         }
  47.                 }
  48.                 //删除StringBuilder对象最后的一个',',并转成字符串,再将字符串按','切割,获得新字符串数组
  49.                 newStrs=sb.deleteCharAt(sb.length()-1).toString().split(",");
  50.                 //返回新字符串数组
  51.                 return newStrs;
  52.         }
  53.         //将指定字符串数组按指定格式输出并换行
  54.         public static void printString(String[] strs){
  55.                 for(String s:strs){
  56.                         System.out.print("\""+s+"\"");
  57.                 }
  58.                 System.out.println();
  59.         }
  60.         //将指定字符数组转成字符串数组,即每个字符串只有一个字符,并返回
  61.         public static String[] chsToStrs(char[] chs){
  62.                 //字符串数组长度和字符数组长度一致
  63.                 String[] strs=new String[chs.length];
  64.                 for(int x=0;x<chs.length;x++)
  65.                         //将单个字符转成单个字符的字符串
  66.                         strs[x]=chs[x]+"";
  67.                 return strs;
  68.         }
  69. }
复制代码

评分

参与人数 1黑马币 +5 收起 理由
sofeel + 5

查看全部评分

回复 使用道具 举报 1 0
我用数学里面的组合给你画了个图,利用这种思想,把字符串转成字符数组试一试,应该能行吧

无标题.png (8.3 KB, 下载次数: 50)

无标题.png

评分

参与人数 1黑马币 +5 收起 理由
sofeel + 5

查看全部评分

回复 使用道具 举报
幸苦楼上的兄弟姐妹了,我实在是没分,不好意思
回复 使用道具 举报
本帖最后由 coolmiao13 于 2015-2-22 01:30 编辑
sofeel 发表于 2015-2-21 23:25
幸苦楼上的兄弟姐妹了,我实在是没分,不好意思

不应该这么浪费滴,花了一晚上,把题目用集合从新写了一遍。开个帖子赚点技术分。给你地址。

http://bbs.itheima.com/thread-171106-1-1.html
回复 使用道具 举报
论坛找找,这道题有很多解法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马