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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 沿途小将 于 2014-8-16 13:39 编辑

题目链接如下:点击跳入题目获取帖
借用阳哥的字(谢谢啦!阳哥):
活动目的:练习javaSE知识,算法题。
活动奖励:最高3个技术分
结束时间:2014年8月15日,过期提交可能获取不到技术分!
代码提交要求:将自己的源代码压缩然后提交,提交的时候设置为管理员权限,以其他方式提交的答案无效。上交源码的时候不需要将整个工程项目压缩,只需将用到的源文件压缩即可。
题目类型:JavaSE 排列组合算法。
难易程度:容易

我的解决思路:
第一步:用Scnner的方式建立一个数组。
第二步:敲一个函数实现老师的要求(排列组合)。
因为这里的题目类型是JavaSE排列组合算法,我认为老师还是重点让大家联系第二步的。故我在这只分享我第二步的思路,要得到数组里的全部元素的所有排列组合,每个人有每个人的方法。我的方法是:数组里每个元素都是从array[0],array[1]...array循环了一个,并把每一个新的数组打印,草图如下:
  1. </blockquote></div>部分代码如下:</span></div><div><span style="font-size: large; line-height: 2.2em;"><div class="blockcode"><blockquote>for (int t = 0; t < i; t++) {
  2.                                 int a = 0;
  3.                                 for (int j = 0; j < i; j++) {
  4.                                         if (j != t) {
  5.                                                 a = arr[j];
  6.                                                 arr[j] = arr[t];
  7.                                                 arr[t] = a;
  8.                                         }
  9.                                         for (int n = 0; n < i; n++) {
  10.                                                 System.out.print(arr[n]);
  11.                                         }
  12.                                         System.out.println();
  13.                                 }
  14.                         }
复制代码

希望对大家在获取那3技术分时有所帮助(抄袭没分呦,亲!)






评分

参与人数 1技术分 +1 收起 理由
格子、 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
这题我也做了很久,还是没搞出来,用递归做,算法有点复杂。
回复 使用道具 举报
怎么又是这个题,之前被讨论过无数遍了。。。来一个增强版的
  1. import java.util.ArrayList;

  2. /*
  3. * 输入N个字符,如'a','b','c',打印出所有组合
  4. * a b c
  5. * ab ac bc ba bc cb
  6. * abc acb bac bca cba cab
  7. *
  8. * 思路:
  9. *   长度为n的字符串排列,是长度为n-1的每个字符串排列的末尾加上一个字符
  10. *   比如,abc是由ab末尾加c得到的;acb是由ac末尾加c得到的。
  11. *   因此,用一个ArrayList不断添加已得到的排列结果。当要排列长度为n的字符串时,让两个指针分别指向长度为n-1的排列在结果集合中的起止下标
  12. */

  13. public class PermuteAllLength {

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

  15.                 String s = "123";
  16.                 printPermute(s);
  17.         }
  18.        
  19.         public static void printPermute(String str) {
  20.                 char[] candidates = str.toCharArray();
  21.                 int len = str.length();
  22.                 ArrayList<String> permutations = new ArrayList<String>(); // 存储排列结果
  23.                 // 长度为1的排列,直接添加
  24.                 for (char c : candidates) {
  25.                         permutations.add(Character.toString(c));
  26.                 }
  27.                
  28.                 // 下标指针,分别指向长度为1的字符串排列的起止位置
  29.                 int start = 0;
  30.                 int end = permutations.size();

  31.                 // 长度2到len的排列,用循环完成
  32.                 for (int i = 2; i <= len; i++) {
  33.                         // 下面的二重循环,外层循环遍历长度为n-1的每一个字符串排列
  34.                         for (; start < end; start++) {
  35.                                 String s = permutations.get(start);
  36.                                 // 内层循环则尝试在长度为n-1的字符串排列的尾部添加一个字符,形成一个长度为n的字符串
  37.                                 for (char c : candidates) {
  38.                                         // 只添加不重复的字符
  39.                                         if (s.indexOf(c) == -1)
  40.                                                 permutations.add(s + c);
  41.                                 }
  42.                         }
  43.                         // 经过循环,start已经指向长度为n-1的字符串排列在结果集合中的起始位置
  44.                         // 现在让end指向指向长度为n-1的字符串排列在结果集合中的终止位置
  45.                         end = permutations.size();
  46.                         // 开始下一次循环,处理长度为n的字符串排列
  47.                 }
  48.                
  49.                 // 打印结果集合及其元素个数
  50.                 System.out.println(permutations);
  51. //                System.out.println(permutations.size());
  52.                
  53.         }

  54. }
复制代码
回复 使用道具 举报
fantacyleo 发表于 2014-8-14 00:17
怎么又是这个题,之前被讨论过无数遍了。。。来一个增强版的

import java.util.*;

/**
* 将一组数字、字母或符号进行排列,以得到不同的组合顺序, 例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3
* 2 1。 要求:用户输入一个整数(0到9)数组(数组长度大于等于3,小于10), 那么请在控制台打印出该数组中所有成员的排列组合
*/
public class MyDemo {
        int i = 0;// 数组长度
        boolean b = false;
        int[] arr;

        public static void main(String[] args) {
                new MyDemo().Comb();
        }

        public MyDemo() {
                System.out.println("您想要几位数进行排列组合?(亲,这个数的范围是3<=X<10)");
                Scanner arrlong = new Scanner(System.in);
                i = arrlong.nextInt();
                if (i >= 3 && i < 10) {
                        arr = new int;
                        for (int j = 0; j < i; j++) {
                                int a = j + 1;
                                System.out.println("请输入第" + a + "个数!");
                                Scanner sc = new Scanner(System.in);
                                arr[j] = sc.nextInt();
                        }
                        b = true;
                } else {
                        System.out.println("亲,你调皮啦!输入的数不合法哦!");
                        b = false;
                }

        }

        public void Comb() {
                if (b) {
                        for (int t = 0; t < i; t++) {
                                int a = 0;
                                for (int j = 0; j < i; j++) {
                                        if (j != t) {
                                                a = arr[j];
                                                arr[j] = arr[t];
                                                arr[t] = a;
                                        }
                                        for (int n = 0; n < i; n++) {
                                                System.out.print(arr[n]);
                                        }
                                        System.out.println();
                                }
                        }
                }
        }

}
回复 使用道具 举报
  1. import java.util.*;

  2. /**
  3. * 将一组数字、字母或符号进行排列,以得到不同的组合顺序, 例如1 2 3这三个数的排列组合有:1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3
  4. * 2 1。 要求:用户输入一个整数(0到9)数组(数组长度大于等于3,小于10), 那么请在控制台打印出该数组中所有成员的排列组合
  5. */
  6. public class MyDemo {
  7.         int i = 0;// 数组长度
  8.         boolean b = false;
  9.         int[] arr;

  10.         public static void main(String[] args) {
  11.                 new MyDemo().Comb();
  12.         }

  13.         public MyDemo() {
  14.                 System.out.println("您想要几位数进行排列组合?(亲,这个数的范围是3<=X<10)");
  15.                 Scanner arrlong = new Scanner(System.in);
  16.                 i = arrlong.nextInt();
  17.                 if (i >= 3 && i < 10) {
  18.                         arr = new int[i];
  19.                         for (int j = 0; j < i; j++) {
  20.                                 int a = j + 1;
  21.                                 System.out.println("请输入第" + a + "个数!");
  22.                                 Scanner sc = new Scanner(System.in);
  23.                                 arr[j] = sc.nextInt();
  24.                         }
  25.                         b = true;
  26.                 } else {
  27.                         System.out.println("亲,你调皮啦!输入的数不合法哦!");
  28.                         b = false;
  29.                 }

  30.         }

  31.         public void Comb() {
  32.                 if (b) {
  33.                         for (int t = 0; t < i; t++) {
  34.                                 int a = 0;
  35.                                 for (int j = 0; j < i; j++) {
  36.                                         if (j != t) {
  37.                                                 a = arr[j];
  38.                                                 arr[j] = arr[t];
  39.                                                 arr[t] = a;
  40.                                         }
  41.                                         for (int n = 0; n < i; n++) {
  42.                                                 System.out.print(arr[n]);
  43.                                         }
  44.                                         System.out.println();
  45.                                 }
  46.                         }
  47.                 }
  48.         }

  49. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马