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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 芒果小姐 中级黑马   /  2016-7-6 15:24  /  609 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

.题目:有1、2、3三个数字,能组成多少个互不相同且无重复数字的三位数?都是多少????
需要把这三个数 转为数组 遍历 再用字符串拼接吗?

6 个回复

正序浏览
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 种组合.
复制代码


回复 使用道具 举报
cat73 发表于 2016-7-6 17:40
其实你这个做法扩展性并不好,如果我换一个要求:
A-Z 总共 26 个字母,可以组成无重复字母的组合有多少 ...

是的,毕竟用循环的话局限性太大,小数据的话,循环好理解,0.0
回复 使用道具 举报
aslwq2012 发表于 2016-7-6 17:35
三个循环就可以搞定,不用数组
由排列组合可知三个数组成一个各不相同的数有6个
int n;

其实你这个做法扩展性并不好,如果我换一个要求:
A-Z 总共 26 个字母,可以组成无重复字母的组合有多少种?
你就要做 26 层循环嵌套。。。。
回复 使用道具 举报
三个循环就可以搞定,不用数组
由排列组合可知三个数组成一个各不相同的数有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);
                        

回复 使用道具 举报
本帖最后由 孟小垚 于 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] + "");
                                }
                        }
                }

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马