黑马程序员技术交流社区

标题: 求助!!!入学测试题好难!!! [打印本页]

作者: bjuth    时间: 2014-11-21 13:55
标题: 求助!!!入学测试题好难!!!
这是入学测试题:

编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
原始字符串是"abc",打印得到下列所有组合情况:
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"



我现在能输出:
"a" "b" "c"
"ab" "ac" "ba" "bc" "ca" "cb"
"abc" "acb" "bac" "bca" "cab" "cba"


算不算没达到要求啊??

作者: 冥夜    时间: 2014-11-21 16:42
额。。。他的要求是随意输出一个字符串输出他的全排列组合
作者: wf111sxwf    时间: 2014-11-21 17:11
我 没做到入学测试呢,这里看了下楼主的题  说说我的思路: 的到的结果是从1个字符开始的并且 最长的情况不能大于原始字符串的长度,那么 楼主就可以根据长度 的 不断增加分别得出 每个长度下的字符组合  进而得出所有组合,  代码由于我还在上班。。。根据这个思路 代码也应该能写出来。  不知论坛其他大神有何高见
作者: cbb    时间: 2014-11-21 18:52
这是我的基础题~~汗~~~~~
作者: 金福林    时间: 2014-11-21 19:59
得,我也遇到这道题了,确实自己没想出来。。。好受打击呀
作者: 聪明叉    时间: 2014-11-21 21:09
http://bbs.itheima.com/thread-113625-1-1.html

发现了这一题论坛的链接
作者: 张凯zk47    时间: 2014-11-21 21:34
我也遇到这题了,百度的
作者: zhangyangLengen    时间: 2014-11-21 21:45
有点难,关键要找出规律,今晚好好想想
作者: bjuth    时间: 2014-12-2 10:04
基础题测试得了9分多 这题应该算是对了

提供一下自己的思路

  1. package com.itheima;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.LinkedList;
  5. import java.util.TreeSet;

  6. /**
  7. * 第8题:编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如: 原始字符串是"abc",打印得到下列所有组合情况: "a" "b" "c"
  8. * "ab" "bc" "ca" "ba" "cb" "ac" "abc" "acb" "bac" "bca" "cab" "cba"
  9. */

  10. public class Test8 {

  11.         // 计算应该排列的数量(此函数可省)
  12.         // 比如有4个字符时是:A41+A42+A43+A44=4+4*3+4*3*2+4*3*2*1,其中A43=A44
  13.         private static int getCount(int length, int l, int count) {
  14.                 int c1 = 1;
  15.                 for (int i = length; i >= l; i--) {
  16.                         c1 = c1 * i;
  17.                 }
  18.                 l--;
  19.                 if (l == 1) {
  20.                         count = count + c1 + c1;
  21.                         // System.out.println(length+" "+l+" "+count);

  22.                         return count;
  23.                 } else {
  24.                         count = count + c1;
  25.                         // System.out.println(length+" "+l+" "+count);
  26.                         return getCount(length, l, count);
  27.                 }
  28.         }

  29.         // 排列
  30.         private static void getPermutation(LinkedList<Character> list, String str,
  31.                         ArrayList<String> arr) {

  32.                 LinkedList<Character> list1 = (LinkedList<Character>) list.clone();
  33.                 String str1;

  34.                 // 以初始str+list内剩余c进行字符串连接,循环遍历
  35.                 for (int j = 0; j < list.size(); j++) {
  36.                         char c = list.get(j);
  37.                         System.out.print(str + c + " ");
  38.                         arr.add(str + c);
  39.                 }

  40.                 // 在list内循环选c,去除选定的c,递归
  41.                 for (int i = 0; i < list1.size(); i++) {
  42.                         str1 = str + list1.get(i);
  43.                         list1.remove(i);
  44.                         getPermutation(list1, str1, arr);
  45.                         list1 = (LinkedList<Character>) list.clone();
  46.                 }

  47.         }

  48.         public static void main(String[] args) {

  49.                 String srcString = "abc";

  50.                 int length = srcString.length();
  51.                 int count = getCount(length, length, 0);
  52.                 System.out.println("应该有:" + count + "种情况");

  53.                 LinkedList<Character> list = new LinkedList<Character>();
  54.                 ArrayList<String> arr = new ArrayList<String>();
  55.                 for (int i = 0; i < length; i++) {
  56.                         list.add(srcString.charAt(i));
  57.                 }

  58.                 System.out.println("生成顺序:");
  59.                 getPermutation(list, "", arr);
  60.                 System.out.println();

  61.                 System.out.println("按需求输出:");
  62.                 for (int i = 0, j = 1, count1 = 0; count1 < arr.size(); i++) {
  63.                         if (i >= arr.size()) {
  64.                                 i = 0;
  65.                                 j++;
  66.                                 System.out.println();
  67.                         } else {
  68.                                 if ((arr.get(i)).length() == j) {
  69.                                         System.out.print("\"" + arr.get(i) + "\" ");
  70.                                         count1++;
  71.                                 }
  72.                         }
  73.                 }

  74.         }

  75. }
复制代码

作者: bjuth    时间: 2014-12-2 10:06
应该有:64种情况
生成顺序:
a b c d ab ac ad abc abd abcd abdc acb acd acbd acdb adb adc adbc adcb ba bc bd bac bad bacd badc bca bcd bcad bcda bda bdc bdac bdca ca cb cd cab cad cabd cadb cba cbd cbad cbda cda cdb cdab cdba da db dc dab dac dabc dacb dba dbc dbac dbca dca dcb dcab dcba
按需求输出:
"a" "b" "c" "d"
"ab" "ac" "ad" "ba" "bc" "bd" "ca" "cb" "cd" "da" "db" "dc"
"abc" "abd" "acb" "acd" "adb" "adc" "bac" "bad" "bca" "bcd" "bda" "bdc" "cab" "cad" "cba" "cbd" "cda" "cdb" "dab" "dac" "dba" "dbc" "dca" "dcb"
"abcd" "abdc" "acbd" "acdb" "adbc" "adcb" "bacd" "badc" "bcad" "bcda" "bdac" "bdca" "cabd" "cadb" "cbad" "cbda" "cdab" "cdba" "dabc" "dacb" "dbac" "dbca" "dcab" "dcba"
作者: 桃华月禅    时间: 2014-12-2 11:35
LZ不是都实现了吗...只是顺序不同就不可以,你以为谁跟你有仇啊...
作者: bjuth    时间: 2014-12-2 14:24
桃华月禅 发表于 2014-12-2 11:35
LZ不是都实现了吗...只是顺序不同就不可以,你以为谁跟你有仇啊...

输出结果顺序不同 说明递归方法不同
这题考的是递归方法 由结果写算法 一定是这样:)
作者: l763631191    时间: 2014-12-2 14:47
好难!!!
作者: liuhao0324    时间: 2014-12-2 16:45
学习了。。。
作者: 禾青青    时间: 2014-12-3 23:40
还好吧  一半




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