黑马程序员技术交流社区

标题: 基础测试有一题有点难,没解决好。请教高手指教。求思路 [打印本页]

作者: 墨香    时间: 2014-5-17 15:35
标题: 基础测试有一题有点难,没解决好。请教高手指教。求思路
/*
* 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:

原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
  1. package com.itheima;
  2. public class Test8{

  3.         public static void main(String[] args)
  4.         {
  5.                 String a=new String("abc");
  6.                 String b=new String();
  7.                 //双循环获取所有组合
  8.                 for(int i=0;i<a.length();i++)
  9.                 {
  10.                         for(int j=i;j<a.length();j++)
  11.                         {

  12.                                  b=converse(a,i,j);

  13.                                 sop(b.substring(i,j+1),"");
  14.                                
  15.                         }
  16.                 }
  17.         }
  18.         //获取从1到length长度子串的所有组合,并输出
  19.         public static void sop(String s,String n)
  20.         {
  21.                 if (s.length() == 0)
  22.                 {  
  23.             System.out.println(n);  
  24.         } else {  
  25.                             for (int i = 0; i < s.length(); ++i)
  26.                             {  
  27.                                 sop(s.substring(1), n + s.charAt(0));  
  28.                                 s = s.substring(1) + s.charAt(0);  
  29.                             }  
  30.                     }
  31.        
  32.         }
  33.         //自定义函数,用于交换字符串中相应字符的位置
  34.         public static String converse(String a,int i,int j)
  35.         {
  36.                 char[] b=a.toCharArray();
  37.                 char temp;
  38.                 temp=b[i];
  39.                 b[i]=b[j];
  40.                 b[j]=temp;
  41.                 return new String(b);
  42.         }
  43.         }
复制代码


* */


作者: 流沙    时间: 2014-5-17 15:46
1、想获取字符串的长度。
2、将字符串单个打印一遍(这个应该简单);

3、将两个字符串的打印一遍,
循环方式是 用第一个a+ 除a以外的每个字符串打印  在用第二个b+除b以外每个字符串打印。

4、这个我感觉好像需要三重循环,
用第一个a和第二个b相连+出ab以外的所有字符打印。
一次类推就能出来

我的想法:没有实验:能看明白么?
作者: skill20    时间: 2014-5-17 16:40
这个靠谱不?
  1. public static void str(){
  2.                 String str = "abc";
  3.                 char[] chr = str.toCharArray();
  4.                 for(int x = 0; x < chr.length; x++){
  5.                         for(int y = 0 ; y < chr.length; y++){
  6.                                 if(x != y)
  7.                                         System.out.println(new String(""+chr[x]+chr[y]));
  8.                                 for(int z = 0; z < chr.length; z++){
  9.                                         if(x != y && y != z && x != z)
  10.                                                 System.out.println("" + chr[x]+ chr[y]+ chr[z]);                                       
  11.                                 }
  12.                         }
  13.                         System.out.println(chr[x]);
  14.                 }
  15.         }
复制代码

作者: ς高眼光の目标    时间: 2014-5-17 18:38
yongdigui.      
作者: pandapan    时间: 2014-5-17 19:10
这个问题在上期的论坛中出现过,不过我还是解答一下吧。
这个问题的处理,正如楼上的所说,用普通的方法处理不太好使,使用递归处理比较合适。
整体的思维方式是,
1.将串分成两部分,一部分为前缀,即 不需要修改的,另外一部分是剩下的串,
2.如果剩下的串的长度为1,那么构成规则便只有一种,就是前缀+剩下的长度为1的串
3. 否则,便可以将剩下的串进行再次分割,将剩下的串的每一位拼接到前缀,递归寻找结果
我就把上次给他人的解答给你吧。

  1. public class Test {
  2.         private static int count=0;
  3.         public static void main(String[] args) {
  4.                 // TODO Auto-generated method stub
  5.                 getDiffCombination("","abc");
  6.                 System.out.println(count);
  7.         }
  8.         
  9.         /**
  10.          * 整体的思维方式是,将串分成两部分,一部分为前缀,即 不需要修改的,另外一部分是剩下的串,
  11.          * 如果剩下的串的长度为1,那么构成规则便只有一种,就是前缀+剩下的长度为1的串
  12.          * 否则,便可以将剩下的串进行再次分割,将剩下的串的每一位拼接到前缀,递归寻找结果
  13.          * @param prefix 字符串的构成前缀
  14.          * @param strLeft 剩下的字符串
  15.          */
  16.         private static void getDiffCombination(String prefix,String strLeft){
  17.                 if(strLeft.length()==1){
  18.                         System.out.println(prefix+strLeft);
  19.                         count++;
  20.                         return;
  21.                 }
  22.                
  23.                 for(int i=0;i<strLeft.length();i++){
  24.                         StringBuilder sb = new StringBuilder(strLeft);
  25.                         String str = prefix+strLeft.substring(i, i+1);
  26.                         System.out.println(str);
  27.                         count++;
  28.                         getDiffCombination(str,sb.deleteCharAt(i).toString());
  29.                 }
  30.         }        
  31. }
复制代码

另外,上次那个提问的同学的方法,我就不列举了,将地址发给你吧。你可以参考参考http://bbs.itheima.com/thread-117433-1-1.html
希望能够帮到你

作者: pandapan    时间: 2014-5-18 22:56
流沙 发表于 2014-5-17 15:46
1、想获取字符串的长度。
2、将字符串单个打印一遍(这个应该简单);

那么如果是abcd呢?4重循环?a~z呢?
作者: 流沙    时间: 2014-5-19 06:37
pandapan 发表于 2014-5-18 22:56
那么如果是abcd呢?4重循环?a~z呢?

你猜。。。。。。。。。。。。。。。。
作者: pandapan    时间: 2014-5-19 18:08
流沙 发表于 2014-5-19 06:37
你猜。。。。。。。。。。。。。。。。

娱乐一下吧,你猜我猜你猜不猜?:lol:lol
作者: 流沙    时间: 2014-5-19 18:48
pandapan 发表于 2014-5-19 18:08
娱乐一下吧,你猜我猜你猜不猜?

你猜我猜你猜我猜不猜?
作者: youcyou    时间: 2014-5-19 20:23
这个楼主也可以参考一下
  1. import java.util.ArrayList;


  2. public class Test5 {
  3.         public static void main(String args[])
  4.         {
  5.                 String s="abc";
  6.                 //调用排序方法
  7.                 combinations(s);
  8.         }
  9.         //排序方法
  10.         private static void combinations(String s) {
  11.                 //创建一个Arraylist用来存放结果
  12.                 ArrayList<String> list =new ArrayList<String>();
  13.                 //将字符串拆分成单个字符存入ArrayList
  14.                 char[] ch = s.toCharArray();
  15.                 for(char c:ch)
  16.                 {
  17.                         list.add(c+"");
  18.                        
  19.                 }
  20.                 //进行循环存入
  21.                 int len=s.length();  //记录随着长度增长产生的字符串个数
  22.                 int start=0;         //用于记数
  23.                 for(int l=2;l<=s.length();l++)  //l表示字符串长度
  24.                 {       
  25.                         //取出l长度的所有字符串
  26.                         for(int x=0;x<len;start++,x++)
  27.                         {        //在l-1长度的字符串末尾添加单个字符串,产生长度为l的字符串
  28.                                 for(int in=0;in<s.length();in++)
  29.                                 {
  30.                                         list.add(list.get(start)+list.get(in));
  31.                                 }
  32.                         }
  33.                         len=len*s.length();
  34.                 }
  35.                 //调用输出字符串方法
  36.                 print(list);
  37.         }
  38.         //输出字符串
  39.         private static void print(ArrayList<String> list) {
  40.                 for(String  ls:list)
  41.                 {       
  42.                         //判断字符串是否含有相同元素,不含有则输出
  43.                         if(!isSame(ls))
  44.                         {
  45.                                 System.out.println(ls);
  46.                         }
  47.                 }
  48.                
  49.         }

  50.         private static boolean isSame(String ls) {
  51.                 //对于长度大于1的进行判断
  52.                 if(ls.length()>1)
  53.                 {       
  54.                         //依次取出该字符串前一半的元素
  55.                         for(int n=0;n<ls.length()/2+1;n++)
  56.                                 {
  57.                                         //对取出的元素进行第一次出现和最后一次出现位置比较,相同则说明只存在一个该元素
  58.                                         if(ls.indexOf(ls.charAt(n))==ls.lastIndexOf(ls.charAt(n)))
  59.                                                 {
  60.                                                
  61.                                                         continue;
  62.                                                        
  63.                                                 }
  64.                                         return true;//否则返回True表示存在相同元素
  65.                                 }
  66.                                 return false;//所有元素判断完,返回false,表示无相同元素。
  67.                 }
  68.                
  69.                 return false;
  70.                
  71.                
  72.                
  73.                
  74.                  
  75.         }

  76. }
复制代码





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