黑马程序员技术交流社区
标题:
入学测试代码:编程列出一个字符串的全字符组合情况,...
[打印本页]
作者:
David.L
时间:
2014-9-25 16:44
标题:
入学测试代码:编程列出一个字符串的全字符组合情况,...
本帖最后由 David.L 于 2014-10-6 20:32 编辑
自己写的代码分享,欢迎探讨指导
package com.itheima;
/*
* 7、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
*思路:
*1,发现组合的最小长度是单个字符,且就是原始字符串的每个字符,而最长长度则和字符串一样
*2,每行新组合都是在前一行旧组合的基础上,将每个旧组合与原始字符串中每个不同字符单独组合一次,获得新组合
*3,新一行组合有多少个,无法马上确定,因为都是字符串,
* 所以可以先用StringBuilder接收每个新组合,最后再切割获得每个新组合
* */
public class Test7 {
public static void main(String[] args) {
//调用方法,传入字符串
show("abc");
}
//编写方法,接收字符串
public static void show(String str){
//将原始字符串转成原始字符数组
char[] chs=str.toCharArray();
//获得原始字符串数组,即每个字符串只有一个字符
String[] strs=chsToStrs(chs);
//按指定格式输出原始字符串数组,即单个字符的组合情况
printString(strs);
//x为每行单个字符串的长度,第一行已经输出,所以从2开始,最长为原始字符串长度,循环输出每行组合
for(int x = 2;x<=str.length();x++){
//调用方法,传入 原始字符数组 和 前一次的字符串数组,获得新的字符串数组
strs=addChar(chs,strs);
//按指定格式输出新的字符串数组
printString(strs);
}
}
//定义方法,接收 原始字符数组 和 前一次的字符串数组,并返回新字符串数组
public static String[] addChar(char[] chs,String[] oldStrs){
//因为新字符数组长度暂时无法确定,也为了转换方便,所以使用StringBuilder来接收每个新字符串
StringBuilder sb=new StringBuilder();
//定义新字符串数组
String[] newStrs=null;
//外循环,遍历每个字符串数组
for(int x=0;x<oldStrs.length;x++){
//内循环,遍历每个原始字符,将每个字符串把每个不同字符都单独添加一次
for(int y=0;y<chs.length;y++){
//判断字符串是否包含该字符,通过indexOf()的返回值>=0来确定已包含
if(oldStrs[x].indexOf(chs[y])>=0)
//已包含该字符,则不操作,继续下次循环
continue;
//不包含该字符,则添加该字符
String s=oldStrs[x]+chs[y];
//添加新字符串到StringBuilder对象并用','隔开
sb.append(s).append(',');
}
}
//删除StringBuilder对象最后的一个',',并转成字符串,再将字符串按','切割,获得新字符串数组
newStrs=sb.deleteCharAt(sb.length()-1).toString().split(",");
//返回新字符串数组
return newStrs;
}
//将指定字符串数组按指定格式输出并换行
public static void printString(String[] strs){
for(String s:strs){
System.out.print("\""+s+"\"");
}
System.out.println();
}
//将指定字符数组转成字符串数组,即每个字符串只有一个字符,并返回
public static String[] chsToStrs(char[] chs){
//字符串数组长度和字符数组长度一致
String[] strs=new String[chs.length];
for(int x=0;x<chs.length;x++)
//将单个字符转成单个字符的字符串
strs[x]=chs[x]+"";
return strs;
}
}
复制代码
作者:
女神从来不加班
时间:
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