黑马程序员技术交流社区

标题: 关于解题 [打印本页]

作者: 芒果小姐    时间: 2016-7-6 15:24
标题: 关于解题
.题目:有1、2、3三个数字,能组成多少个互不相同且无重复数字的三位数?都是多少????
需要把这三个数 转为数组 遍历 再用字符串拼接吗?
作者: 孟小垚    时间: 2016-7-6 15:54
本帖最后由 孟小垚 于 2016-7-6 19:20 编辑

int[] arr = {1,2,3};
                for (int i = 0; i < arr.length; i++) {
                        for (int j = 0; j < arr.length ; j++) {
                                for (int j2 = 0; j2 < arr.length; j2++) {
                                        System.out.println(arr + "" + arr[j] + "" + arr[j2] + "");
                                }
                        }
                }


作者: aslwq2012    时间: 2016-7-6 17:35
三个循环就可以搞定,不用数组
由排列组合可知三个数组成一个各不相同的数有6个
int n;
int a=0;
for(int i =1;i《=3;i++){
    for(int j =1;j《=3;;j++) {
         for(int k =1;k 《=3;k++) {
                    if (i!=j&&i!=k&&j!=k) {
                           n=i*100+j*10+k;
                            a++;




System.out.print(n+“  ”);
System.out.println();
System.out.println(a);
                        


作者: cat73    时间: 2016-7-6 17:40
aslwq2012 发表于 2016-7-6 17:35
三个循环就可以搞定,不用数组
由排列组合可知三个数组成一个各不相同的数有6个
int n;

其实你这个做法扩展性并不好,如果我换一个要求:
A-Z 总共 26 个字母,可以组成无重复字母的组合有多少种?
你就要做 26 层循环嵌套。。。。
作者: aslwq2012    时间: 2016-7-6 17:47
cat73 发表于 2016-7-6 17:40
其实你这个做法扩展性并不好,如果我换一个要求:
A-Z 总共 26 个字母,可以组成无重复字母的组合有多少 ...

是的,毕竟用循环的话局限性太大,小数据的话,循环好理解,0.0
作者: cat73    时间: 2016-7-6 18:12
本帖最后由 cat73 于 2016-7-6 18:13 编辑

如果只要数量的话,其实可以直接用数学计算求解的。。。
代码随便写写的,效率很低,还很有优化空间。。。

  1.     public static void main(final String args[]) throws Exception {
  2.         new Main()._main(args);
  3.     }

  4.     private void _main(final String args[]) throws Exception {
  5.         int count = this.calc(System.out, new char[] { '1', '2', '3', '4' });
  6.         System.out.println("一共有 " + count + " 种组合.");
  7.     }

  8.     /**
  9.      * @param out 输出每一种可能的组合的流,如不需要输出请设置为 null
  10.      * @param chs 每一个可能的值
  11.      */
  12.     public int calc(final PrintStream out, final char[] chs) {
  13.         // 准备一个数组保存每一位的状态
  14.         final int[] array = new int[chs.length];
  15.         for (int i = 0; i < chs.length; i++) {
  16.             array[i] = 0;
  17.         }

  18.         // 组合数量
  19.         int result = 0;

  20.         // 循环求解
  21.         while (true) {
  22.             // 当前数是否符合规则:每一位上的数字均不同
  23.             boolean ok = true;
  24.             for (int i = 0; i < array.length; i++) {
  25.                 for (int j = 0; j < array.length; j++) {
  26.                     if (i != j && array[i] == array[j]) {
  27.                         ok = false;
  28.                         break;
  29.                     }
  30.                 }
  31.                 if (!ok) {
  32.                     break;
  33.                 }
  34.             }
  35.             // 如果符合规则则将计数器加 1,并输出结果
  36.             if (ok) {
  37.                 result += 1;

  38.                 if (out != null) {
  39.                     final StringBuilder sb = new StringBuilder(array.length);
  40.                     for (final int element : array) {
  41.                         sb.append(chs[element]);
  42.                     }
  43.                     out.println(sb.toString());
  44.                 }
  45.             }

  46.             // 将第一位加 1,如果第一位已经超过了最大值,则进行进位,如已经没有下一个位用于进位,则返回结果
  47.             array[0] += 1;
  48.             for (int i = 0; i < array.length && array[i] == chs.length; i++) {
  49.                 array[i] = 0;
  50.                 if (i + 1 < array.length) {
  51.                     array[i + 1] += 1;
  52.                 } else {
  53.                     return result;
  54.                 }
  55.             }
  56.         }
  57.     }
复制代码


输出结果:
  1. 4321
  2. 3421
  3. 4231
  4. 2431
  5. 3241
  6. 2341
  7. 4312
  8. 3412
  9. 4132
  10. 1432
  11. 3142
  12. 1342
  13. 4213
  14. 2413
  15. 4123
  16. 1423
  17. 2143
  18. 1243
  19. 3214
  20. 2314
  21. 3124
  22. 1324
  23. 2134
  24. 1234
  25. 一共有 24 种组合.
复制代码



作者: 芒果小姐    时间: 2016-7-10 17:18
cat73 发表于 2016-7-6 18:12
如果只要数量的话,其实可以直接用数学计算求解的。。。
代码随便写写的,效率很低,还很有优化空间。。。
...

非常感谢`` 长知识咯




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