黑马程序员技术交流社区

标题: 给予几个元素,求最多组合示列 [打印本页]

作者: 陈圳    时间: 2013-3-5 22:29
标题: 给予几个元素,求最多组合示列
本帖最后由 陈圳 于 2013-3-5 22:31 编辑

示例:有1、2、3、4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?   
但我想实现的是随意给予几个元素.限定组合个数,其实其组合...
求高级算法!..............................................................................................................
效率越高越好,代码越少越好.跪求{:soso_e109:}
另外...散币散币.每人/5  *120 +税==720...

作者: amen0205    时间: 2013-3-5 23:54
你都27分了 这么快啊  我先得5J  再去写算法
作者: amen0205    时间: 2013-3-5 23:59
1 2 3 4  这太简单了 12  不过要是 a b c d 的话 取值[0-9]  
作者: 明锦添    时间: 2013-3-6 00:47
本帖最后由 明锦添 于 2013-3-6 01:13 编辑

package com.soft.test;

/**
* 实现方式,将数组的第一个元素拿出来排放在数组的第一个位置、第二个位置,到第n个位置,其它顺序不变,直到一轮排完,将原第一个元素放到最后,然后又从头往复。
*
* @author Administrator
*
*/
public class Algorithm {

        public static void main(String[] args) {
                int[] arrays = { 1, 2, 3, 4 };// 数组

                for (int i = 0; i < arrays.length; i++) {// 将原数组的第一个元素,重新排在第一位输出没有意义(也不方便循环输出),故直接输出。
                        System.out.print(arrays + " ");
                }

                System.out.println();
                insert(arrays);
        }

        public static void insert(int[] arrays) {
                int k = 0;
                for (int j = 0; j < arrays.length; j++) {
                        for (int i = 1; i < arrays.length; i++) {// 每次将第一个元素从第二个位置,第三个位置,第n...排列,输出。。
                                if (j == arrays.length - 1 && i == arrays.length - 1) // 将原数组的最后一个元素,重新排在最后位输出没有意义(与原数组相同),故直跳过。
                                        return;
                                show(arrays, i);
                        }
                        int n = arrays[0];// 一趟完成后,将原数组中的第一个元素移到数组末尾
                        for (k = 0; k < arrays.length - 1; k++) {
                                arrays[k] = arrays[k + 1];
                        }
                        arrays[k] = n;
                }
        }

        public static void show(int[] arrays, int newPos) {
                int number = arrays[0];
                for (int i = 1; i <= newPos; i++) {// 输出新数据插入位置前的数据,
                        System.out.print(arrays + " ");
                }
                System.out.print(number + " ");// 输出插入的数据
                for (int i = newPos + 1; i < arrays.length; i++) {// 输出插入位置及后面的数据
                        System.out.print(arrays + " ");
                }
                System.out.println();
        }
}  
运行结果:
1 2 3 4
2 1 3 4
2 3 1 4
2 3 4 1
3 2 4 1
3 4 2 1
3 4 1 2
4 3 1 2
4 1 3 2
4 1 2 3
1 4 2 3
1 2 4 3  
汗颜,看错题目了,我还以为是计算排列组合{:soso_e127:}




作者: 夏晓彤    时间: 2013-3-6 00:59
哎技术分都27了羡慕啊,不过确实简单
class Test
        {


                public static void main(String[] args)
             {
                        int[]arryArr =new int[]{1,2,3,4};

                        for(int i=0;i<4;i++)
                                for(int j=0;j<4;j++)
                                        for(int n=0;n<4;n++){
                                       
                                                System.out.println(( arryArr*100)+(arryArr[j]*10)+(arryArr[n]));
                                                
                                        }
             }
        }

作者: amen0205    时间: 2013-3-6 01:01
本帖最后由 门文通 于 2013-3-6 01:05 编辑
  1. class  San
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr=new int[]{4,6,7,2,5,3,9,3,3,3,9,0,2};//定义随意数组
  6.                 int m=san(arr);
  7.                 System.out.println("Hello World!.........."+m);
  8.         }
  9.         public static int san(int[] arr)
  10.         {
  11.                 for(int x=0;x<arr.length;x++)

  12.                 {
  13.                         if(arr[x]<0 || arr[x]>9)//判断是否为0-9之间 单位数最多到999   不是则返回1000
  14.                                 return 1000;
  15.                 }

  16.                 int n=0;
  17.                 int[] a=new int[10];
  18.                 for(int y=0;y<10;y++)
  19.                 {
  20.                         for(int x=0;x<arr.length;x++)
  21.                         {
  22.                                 if(arr[x]==y)
  23.                                         n++;//对数组中每个数字的个数计数  并存到另一个数组
  24.                                 
  25.                         }System.out.print(n);
  26.                         a[y]=n;
  27.                         n=0;
  28.                
  29.                 }
  30.                 int m=arr.length;
  31.                 for(int x=0;x<10;x++)//去除数组中重复元素后的剩余个数
  32.                 {
  33.                         if(a[x]!=0)
  34.                                 m=m-a[x]+1;
  35.                         
  36.                 }
  37.                 if(a[0]==0)
  38.                         return m*m*m;

  39.                 else
  40.                         return m*(m-1)*m;
  41.                         
  42.                
  43.         }
  44. }
复制代码
刚写的  作用是  把任意个0-9之间的int型数字 任意组合三位数  有多少
思想是    三位数,最高位不能为0 ,其他位置可以是0-9的数字,我先吧数组中0-9  不重复的个数求出来
            如是7个数   如果包涵0  那结果就是6*7*7  如果没有0  就是7*7*7
作者: 李培根    时间: 2013-3-6 10:28
楼主有钱人,只想到了A43
作者: 黑马-李嘉欣    时间: 2013-3-6 14:47
这个得好好想想~
作者: Gaara    时间: 2013-3-6 14:50
回就有金币?
作者: 彭波    时间: 2013-3-6 15:14
这个我要好好想啊
作者: 曹春贵    时间: 2013-3-6 19:11
我要好好考虑
作者: 黑马-李嘉欣    时间: 2013-3-6 19:50
你太有爱了~~
作者: ⋛⋌⋚JEEP    时间: 2014-7-27 22:08
好好想一下:)
作者: 刘斌2014    时间: 2014-7-29 09:18
这个问题我能回答 不过已经有人回答过了 那我就默默的看吧
作者: 狐狸FMF    时间: 2014-8-12 21:54
楼主威武
作者: 黄小橙    时间: 2014-10-4 08:56
!!!5个黑马币
作者: 杨佳名    时间: 2014-10-6 14:04
5个币!
作者: wujiemin    时间: 2014-10-7 09:32
学习学习。5555
作者: 彭小虎    时间: 2014-11-17 10:19
谢谢楼主的金币
作者: hamesksk    时间: 2015-3-16 00:44
这个得好好想想~
作者: 吴阳    时间: 2015-3-16 13:32
我是来学习的 受用的
作者: 等风的车    时间: 2015-3-16 13:48
楼主威武
作者: yuanyuemao88    时间: 2015-8-2 17:44
      学习学习
作者: 小小鸟311    时间: 2015-12-15 23:16
只为币而来
作者: csc    时间: 2015-12-25 01:30
这个好啊
作者: 猪冲在前方    时间: 2016-3-21 22:59
youdian难duo




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