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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李海明 中级黑马   /  2015-4-23 16:24  /  1952 人查看  /  33 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

提示: 该帖被管理员或版主屏蔽

33 个回复

倒序浏览
  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-24 11:00
回复 使用道具 举报
哔哩哔哩 发表于 2015-4-23 22:49
自己写的,希望对你有帮助。

非常感谢
回复 使用道具 举报
字符串的问题还没懂,表示飘过~~~
回复 使用道具 举报
哔哩哔哩 发表于 2015-4-23 22:49
自己写的,希望对你有帮助。

思路简单有效率,学习了大神!
回复 使用道具 举报
我跟你说说思路

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

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

非常感谢
回复 使用道具 举报

看懂了,就会觉得很简单的
回复 使用道具 举报
大圈套小圈
回复 使用道具 举报
哔哩哔哩 发表于 2015-4-23 22:49
自己写的,希望对你有帮助。

哥们儿,你这个代码贴上来怎么这么漂亮啊,怎么弄的,求指点
回复 使用道具 举报
这是我借鉴论坛一位同学写的代码,希望有用,代码插入功能是<>图标那个
  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. }
复制代码
回复 使用道具 举报
我表示遗憾,祝你好运
回复 使用道具 举报
领教了!
回复 使用道具 举报
基础题不会的能不能直接说不会啊- - 还是要弄懂了在写上去 那不是都对了吗
回复 使用道具 举报
用递归的思想完成就可以
回复 使用道具 举报
我也被这道题卡住了,厉害
回复 使用道具 举报
这个很简单那 你使用循环就可以了
回复 使用道具 举报
好长啊= =
回复 使用道具 举报
感觉还是自己先思考一会的好,别一没思路,就HELP。
回复 使用道具 举报
IDhmpj 发表于 2015-4-24 00:44
哥们儿,你这个代码贴上来怎么这么漂亮啊,怎么弄的,求指点

高级编辑里边有个<> 可以贴代码
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马