黑马程序员技术交流社区

标题: 入学测试代码:编程列出一个字符串的全字符组合情况,... [打印本页]

作者: David.L    时间: 2014-9-25 16:44
标题: 入学测试代码:编程列出一个字符串的全字符组合情况,...
本帖最后由 David.L 于 2014-10-6 20:32 编辑

自己写的代码分享,欢迎探讨指导
  1. package com.itheima;


  2. /*
  3. * 7、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:

  4.                 原始字符串是"abc",打印得到下列所有组合情况:
  5.                 "a" "b" "c"
  6.                 "ab" "bc" "ca" "ba" "cb" "ac"
  7.                 "abc" "acb" "bac" "bca" "cab" "cba"
  8.                
  9. *思路:
  10. *1,发现组合的最小长度是单个字符,且就是原始字符串的每个字符,而最长长度则和字符串一样
  11. *2,每行新组合都是在前一行旧组合的基础上,将每个旧组合与原始字符串中每个不同字符单独组合一次,获得新组合
  12. *3,新一行组合有多少个,无法马上确定,因为都是字符串,
  13. *        所以可以先用StringBuilder接收每个新组合,最后再切割获得每个新组合
  14. * */

  15. public class Test7 {

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




作者: 女神从来不加班    时间: 2015-3-5 00:27
看了一会儿才明白 多谢高手
作者: zuoyou    时间: 2015-5-27 21:45
学习了,,,
作者: VIP1108210117    时间: 2015-6-11 23:26
输入“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"

正确测试结果应为:
"a"        ","        "c"       
"a,"        "ac"        ",a"        ",c"        "ca"        "c,"       
"a,c"        "ac,"        ",ac"        ",ca"        "ca,"        "c,a"

可以看看这个帖子:
编程列出一个字符串的全字符组合情况"的新解法
http://bbs.itheima.com/thread-203214-1-1.html
(出处: 黑马程序员IT技术论坛)

作者: 冬日温暖    时间: 2015-7-1 16:28
挺好的,赞一个,来学习一下
作者: dajiaoya    时间: 2015-7-19 17:56
分享快乐 赞一个 高手
作者: shero    时间: 2015-7-28 14:44
写的不错。。赞个。。
作者: 15225159271    时间: 2015-7-30 17:12
厉害,我看了好久
作者: 树懒    时间: 2015-7-31 12:11
我也有那道题的
作者: 千山万水    时间: 2015-8-3 21:22
好难得样子
作者: EastKK    时间: 2015-8-6 15:51
VIP1108210117 发表于 2015-6-11 23:26
输入“a,b”的时候测试结果不正确,如下:
"a"",""c"
"a""""ac""""a""""c""ca""c"

把楼主的代码第72行后面那里改成append(" ")
然后第76行那里改成去掉最后一个空格然后按空格(" ")切割,就可以了,这样就不会因为你输入逗号而被切割掉
作者: 午后阿怪    时间: 2015-8-6 21:46
赞,多谢大神分享经验..
作者: 风华正茂    时间: 2015-8-14 12:33
多谢楼主分享经验
作者: ln0491    时间: 2015-8-25 11:48
不太明白,学习下
作者: Vincent饭饭    时间: 2015-8-25 16:08
谢谢楼主分享,可以看到楼主对字符串数组真的是非常精通啊,StringBuffer的运用也很到位。但是楼主的方法感觉有些面向过程了,不知道还有没有其他的大神可以提供一些更为直观的方法,有没有可以直接引用的类方法可以解决这个问题?
作者: 刘德坤    时间: 2015-10-7 11:00
进来学习学习,,谢谢大神分享
作者: 1975532882    时间: 2015-10-20 10:32
niubi ,,,,,,,,,,,,,,,

作者: 愿随风丶飘雪    时间: 2016-1-16 23:03
大神你牛逼,啥玩意了这是
作者: ShenFangyu    时间: 2016-4-26 22:03
太给力了




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