黑马程序员技术交流社区

标题: 一道基础测试题有点不会 [打印本页]

作者: 李海明    时间: 2015-4-23 16:24
提示: 该帖被管理员或版主屏蔽
作者: 哔哩哔哩    时间: 2015-4-23 22:49
  1. import java.util.Arrays;

  2. public class Test {
  3.         public static void main(String[] args) {
  4.                 new Test().print("abc");
  5.         }

  6.         public void print(String str) {
  7.                 char[] c = str.toCharArray();
  8.                 int length = str.length();
  9.                 for (int i = 1; i <= length; i++) {
  10.                         printByNumber(c, i, "");
  11.                         System.out.println();
  12.                 }
  13.         }

  14.         private void printByNumber(char[] c, int num, String str) {
  15.                 if (num == 1) {
  16.                         for (int i = 0; i < c.length; i++) {
  17.                                 System.out.print("\"" + str + c[i] + "\" ");
  18.                         }
  19.                 } else {
  20.                         for (int i = 0; i < c.length; i++) {
  21.                                 char[] temp = new char[c.length - 1];
  22.                                 int index = 0;
  23.                                 for (int j = 0; j < c.length; j++) {//刚开始把j!=i直接写在for的表达式2位置了,一直不执行for,我也真是日了狗了......
  24.                                         if (j != i) {
  25.                                                 temp[index++] = c[j];
  26.                                         }
  27.                                 }
  28.                                 printByNumber(temp, num - 1, str + c[i]);
  29.                         }
  30.                 }
  31.         }

  32. }
复制代码
自己写的,希望对你有帮助。

作者: 李海明    时间: 2015-4-23 23:00
哔哩哔哩 发表于 2015-4-23 22:49
自己写的,希望对你有帮助。

非常感谢
作者: 龙腾浩少    时间: 2015-4-23 23:04
字符串的问题还没懂,表示飘过~~~
作者: Zack    时间: 2015-4-23 23:27
哔哩哔哩 发表于 2015-4-23 22:49
自己写的,希望对你有帮助。

思路简单有效率,学习了大神!
作者: 我_杰仔    时间: 2015-4-23 23:52
我跟你说说思路

1.用个外层循环控制字符串的长度,比如一个字符串有5位,那么共有5种情况对应不同长度的字符串
2.内层循环是从第一位起,截取相应长度的字符串(如果长度不够,则顺延到第一位)。每次循环后都会把第一位移向下一位
3.把截取到的字符串反转
4.打印截取到的字符串以及反转后的字符串
作者: 李海明    时间: 2015-4-24 00:03
我_杰仔 发表于 2015-4-23 23:52
我跟你说说思路

1.用个外层循环控制字符串的长度,比如一个字符串有5位,那么共有5种情况对应不同长度的字 ...

非常感谢
作者: 哔哩哔哩    时间: 2015-4-24 00:10
Imtonoo 发表于 2015-4-23 23:47
这也太难了吧

看懂了,就会觉得很简单的
作者: Taekwon-boy    时间: 2015-4-24 00:34
大圈套小圈
作者: IDhmpj    时间: 2015-4-24 00:44
哔哩哔哩 发表于 2015-4-23 22:49
自己写的,希望对你有帮助。

哥们儿,你这个代码贴上来怎么这么漂亮啊,怎么弄的,求指点
作者: Demomiku    时间: 2015-4-24 08:48
这是我借鉴论坛一位同学写的代码,希望有用,代码插入功能是<>图标那个
  1. import java.util.*;
  2. import java.io.*;

  3. public class Test5
  4. {
  5.         public static int count = 0;
  6.         public static void main(String[] args)throws IOException
  7.         {
  8.                 //新建一个TreeSet用于存储排列后的组合,并提供一个自定义的比较器
  9.                 TreeSet<String> set = new TreeSet<String>(new MyComp());
  10.                
  11.                 //接收键盘输入的字符串
  12.                 String line = new Scanner(System.in).nextLine();
  13.                
  14.                 //调用函数
  15.                 getDiff("",line,set);
  16.                
  17.                 //遍历集合,输出元素
  18.                 Iterator<String> it = set.iterator();
  19.                 int i = 1;
  20.                 while(it.hasNext())
  21.                 {
  22.                         String s = it.next();
  23.                        
  24.                         //换行
  25.                         if(s.length() > i)
  26.                         {
  27.                                 System.out.println();
  28.                                 i++;
  29.                         }
  30.                        
  31.                         //按格式输出元素
  32.                         System.out.print("\""+s+"\"");
  33.                        
  34.                 }
  35.         }
  36.        
  37.         /*
  38.          * 整体的思维方式是,将串分成两部分,一部分为前缀,即 不需要修改的,另外一部分是剩下的串,
  39.          * 如果剩下的串的长度为1,那么构成规则便只有一种,就是前缀+剩下的长度为1的串,存入TreeSet中,之所以使用TreeSet是因为可以过滤掉重复的元素,而且可以通过重写比较器进行排序.
  40.          * 否则,便可以将剩下的串进行再次分割,将剩下的串的每一位拼接到前缀,递归寻找结果,并将结果存入TreeSet中.
  41.          * @param prefix 字符串的构成前缀
  42.          * @param strRight 剩下的字符串
  43.          */
  44.         private static void getDiff(String prefix,String strRight,TreeSet<String> set)
  45.         {
  46.                 //如果字符串的长度为1,直接添加进set中
  47.         if(strRight.length()==1)
  48.         {
  49.             
  50.                 if(!(set.contains(prefix+strRight)))
  51.                                 set.add(prefix+strRight);
  52.                 count++;
  53.                 return;
  54.         }
  55.       
  56.         //通过递归寻找结果
  57.         for(int i=0;i<strRight.length();i++)
  58.         {
  59.                 StringBuilder sb = new StringBuilder(strRight);
  60.                 String str = prefix+strRight.substring(i, i+1);
  61.                 if(!(set.contains(str)))
  62.                             set.add(str);
  63.                 count++;
  64.                 getDiff(str,sb.deleteCharAt(i).toString(),set);
  65.         }
  66.         }        
  67.        
  68. }

  69. //自定义比较器进行排序
  70. class MyComp implements Comparator
  71. {
  72.         public int compare(Object o1,Object o2)
  73.         {
  74.                 String str1 = (String)o1;
  75.                 String str2 = (String)o2;
  76.                 int num = str1.length()-str2.length();
  77.                 if(num == 0)
  78.                         return str1.compareTo(str2);
  79.                 return num;
  80.         }
  81. }
复制代码

作者: 柒夜    时间: 2015-4-24 08:59
我表示遗憾,祝你好运
作者: 只吃饭不洗碗    时间: 2015-4-24 09:25
领教了!
作者: 铃铃铃铃铃锋    时间: 2015-4-24 16:48
基础题不会的能不能直接说不会啊- - 还是要弄懂了在写上去 那不是都对了吗
作者: 海阔天空监管科    时间: 2015-4-24 19:00
用递归的思想完成就可以
作者: 尘埃123    时间: 2015-4-24 19:39
我也被这道题卡住了,厉害
作者: 安日成    时间: 2015-4-24 19:53
这个很简单那 你使用循环就可以了
作者: 殃金咒    时间: 2015-4-24 21:00
好长啊= =
作者: PENGLIU_0819    时间: 2015-4-24 21:03
感觉还是自己先思考一会的好,别一没思路,就HELP。
作者: 哔哩哔哩    时间: 2015-4-24 21:09
IDhmpj 发表于 2015-4-24 00:44
哥们儿,你这个代码贴上来怎么这么漂亮啊,怎么弄的,求指点

高级编辑里边有个<> 可以贴代码
作者: IDhmpj    时间: 2015-4-24 22:06
哔哩哔哩 发表于 2015-4-24 21:09
高级编辑里边有个 可以贴代码

原来如此,谢了
作者: lai19    时间: 2015-4-24 22:10
看看学习学习再学习
作者: mocun    时间: 2015-4-24 22:30
厉害  黑马基础班的飘过   表示Java真心不容易
作者: 最好的我    时间: 2015-4-24 22:32
不会~~~看看就好了~~~~~~~~发~~~
作者: xfliyy    时间: 2015-4-24 22:33
学习学习
作者: nine789    时间: 2015-4-24 22:40
还没学到哪里,你们真的很牛啊
作者: 匡璐    时间: 2015-4-24 22:52
都是大神 >>>顶
作者: ixue    时间: 2015-4-24 22:52
我也学习下

作者: 张红兴    时间: 2015-5-15 18:43
:handshake
作者: 小风1993    时间: 2015-5-15 19:09
二楼的做法真的学到了
作者: youngzk    时间: 2015-5-15 21:25
我也表示飘过,因为我没看懂啊
作者: 冷雨敲窗被未温    时间: 2015-5-16 09:30
怎么看不到了




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