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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ※无价※之宝 中级黑马   /  2015-1-6 10:20  /  1348 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前几天下载了基础测试题,10道题有一道不会做,求大神们给思路,题目如下
编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:

原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"



虽然百度有答案,但是没有注释,也没有解释,学习要的不是答案,而是思路,只有思路会了,才能学到东西,希望会的大神能指点一下
说下大概的思路

15 个回复

倒序浏览
毕老爷有讲过这题,看视频去吧
回复 使用道具 举报
我想到办法了,可以用FOR嵌套
回复 使用道具 举报
菜鸟一号 发表于 2015-1-6 10:45
毕老爷有讲过这题,看视频去吧

现在还在看视频,还没看到那里吧,在第几天的视频里面啊?
回复 使用道具 举报
字符串切割,循环,递归
回复 使用道具 举报
liqudely 发表于 2015-1-6 10:51
我想到办法了,可以用FOR嵌套

能大概讲一下思路吗?
回复 使用道具 举报
qq8921310 发表于 2015-1-6 11:07
字符串切割,循环,递归

大哥,你这思路也太大概了:L
回复 使用道具 举报
※无价※之宝 发表于 2015-1-6 11:11
能大概讲一下思路吗?

先把字符串转换成字符数组,然后用2重for循环打印出所有组合
回复 使用道具 举报
你可以用递归,获取长度,比如第一次是3,进行一次全排列,然后调用自身,长度改为2,全排列,依次类推
回复 使用道具 举报
  1. package com.itheima;

  2. import java.util.Scanner;

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

  5.         原始字符串是"abc",打印得到下列所有组合情况:
  6.         "a" "b" "c"
  7.         "ab" "bc" "ca" "ba" "cb" "ac"
  8.         "abc" "acb" "bac" "bca" "cab" "cba"
  9. * */
  10. public class Test4 {

  11.         public static void main(String[] args){
  12.                 //创建一个容器
  13.                 StringBuilder sb = new StringBuilder();
  14.                 //abc转为字符数组。
  15.                 char[] ch = "abc".toCharArray();
  16.                 //首先一个单个字符全排列
  17.                 for(char i :  ch){
  18.                        
  19.                         System.out.print("\""+i+"\""+"\t");
  20.                 }
  21.                 System.out.println();
  22.                
  23.                 //然后取出两个两个字符。
  24.                 for(int i=0 ;i<ch.length;i++){
  25.                        
  26.                         for(int j=i+1; j<ch.length;j++){
  27.                                
  28.                                 System.out.print("\""+ch[i]+ch[j]+"\""+"\t");
  29.                                 sb.append(ch[i]+ch[j]+"\t");
  30.                                 System.out.print("\""+ch[j]+ch[i]+"\""+"\t");       
  31.                                 sb.append(ch[j]+ch[i]+"\t");
  32.                         }
  33.                 }
  34.                 System.out.println();
  35.                 //取出三个字符组合
  36.                 for(int i=0 ;i<ch.length;i++){
  37.                        
  38.                         for(int j=0; j<ch.length;j++){
  39.                                
  40.                                 for(int k=0;k<ch.length;k++){
  41.                                        
  42.                                        
  43.                                         if(ch[i]!=ch[j]&&ch[i]!=ch[k]&&ch[j]!=ch[k]){
  44.                                                
  45.                                                 System.out.print("\""+ch[i]+ch[j]+ch[k]+"\""+"\t");
  46.                                         }
  47.                                 }
  48.                         }
  49.                 }
  50.                
  51.         }
  52. }
复制代码
回复 使用道具 举报

你这种太具体了,只针对了长度为3的字符串,要是能让用户输入的呢?
回复 使用道具 举报

我对题目的理解是abc只是举的一个例子,题的意思是不管输入多少理论上都成立 即输入abcd的时候也能列出"a"..."ab"..."abc"..."abcd"...因为不知道要循环多少次所以需要用到递归单纯的循环肯定不行
回复 使用道具 举报
jant60 发表于 2015-1-6 12:44
你可以用递归,获取长度,比如第一次是3,进行一次全排列,然后调用自身,长度改为2,全排列,依次类推 ...

大概懂了,我试一下:lol
回复 使用道具 举报
搞了好几个小时,终于是搞出来了
  1. package com.itheima;

  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Scanner;

  5. public class MyTest7 {

  6.         private static char[] cs;
  7.         private static List<String> list = new ArrayList<String>();
  8.         /**
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12.                 // TODO Auto-generated method stub
  13.                 System.out.println("请输入没有重复的字符串");
  14.                 Scanner sc = new Scanner(System.in);
  15.                 String s = sc.next();
  16.                 cs = s.toCharArray();
  17.                 sc.close();
  18.                 dealWith();
  19.                 for(String e : list){
  20.                         System.out.println(e);
  21.                 }
  22.         }
  23.         public static void dealWith(){
  24.                 for(int i = 0;i<cs.length;i++){                       
  25.                         list.addAll(deal(i));
  26.                 }
  27.         }
  28.        
  29.         public static List<String> deal(int count){
  30.                 List<String> s = new ArrayList<String>();
  31.                 for(int i = 0; i < cs.length; i++){
  32.                         if(count == 0){
  33.                                 s.add(cs[i]+"");
  34.                         }else{
  35.                                 List<String> result = deal(count-1);
  36.                                 for(int j = 0; j < result.size(); j++){
  37.                                         char[] cc = result.get(j).toCharArray();
  38.                                         boolean flag = true;
  39.                                         for(int t = 0; t < cc.length; t++){       
  40.                                                 if(cc[t]==cs[i]){
  41.                                                         flag = false;
  42.                                                         break;                                                       
  43.                                                 }
  44.                                         }
  45.                                         if(flag){
  46.                                                 s.add(cs[i]+result.get(j));
  47.                                         }
  48.                                 }
  49.                         }
  50.                 }
  51.                 return s;
  52.         }
  53. }
复制代码
回复 使用道具 举报
学习下....
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马