代码实现排列组合【Java】
一.代码实现
 package zhen;
 import java.util.Arrays;
 public class Arrangement {
       /**
      * 计算阶乘数,即n! = n * (n-1) * ... * 2 * 1
      */
     private static long factorial(int n) {
         long sum = 1;
         while( n > 0 ) {
             sum = sum * n--;
         }
         return sum;
     }
       /**
      * 排列计算公式A = n!/(n - m)!
      */
     public static long arrangement(int m, int n) {
         return m <= n ? factorial(n) / factorial(n - m) : 0;
     }
      /**
      * 排列选择(从列表中选择n个排列)
      * @param dataList 待选列表
      * @param n 选择个数
      */
     public static void arrangementSelect(String[] dataList, int n) {
         System.out.println(String.format("A(%d, %d) = %d", dataList.length, n, arrangement(n, dataList.length)));
         arrangementSelect(dataList, new String[n], 0);
     }
     /**
      * 排列选择
      * @param dataList 待选列表
      * @param resultList 前面(resultIndex-1)个的排列结果
      * @param resultIndex 选择索引,从0开始
      */
     private static void arrangementSelect(String[] dataList, String[] resultList, int resultIndex) {
         int resultLen = resultList.length;
         if(resultIndex >= resultLen) { // 全部选择完时,输出排列结果
             System.out.println(Arrays.asList(resultList));
             return;
         }
         // 递归选择下一个
         for(int i = 0; i < dataList.length; i++) {
             // 判断待选项是否存在于排列结果中
             boolean exists = false;
             for (int j = 0; j < resultIndex; j++) {
                 if (dataList[i].equals(resultList[j])) {
                     exists = true;
                     break;
                 }
             }
             if (!exists) { // 排列结果不存在该项,才可选择
                 resultList[resultIndex] = dataList[i];
                 arrangementSelect(dataList, resultList, resultIndex + 1);
             }
         }
     }
     /**
      * 组合计算公式C<sup>m</sup><sub>n</sub> = n! / (m! * (n - m)!)
      * @param m
      * @param n
      * @return
      */
     public static long combination(int m, int n) {
         return m <= n ? factorial(n) / (factorial(m) * factorial((n - m))) : 0;
     }
     /**
      * 组合选择(从列表中选择n个组合)
      * @param dataList 待选列表
      * @param n 选择个数
      */
     public static void combinationSelect(String[] dataList, int n) {
         System.out.println(String.format("C(%d, %d) = %d", dataList.length, n, combination(n, dataList.length)));
         combinationSelect(dataList, 0, new String[n], 0);
     }
     /**
      * 组合选择
      * @param dataList 待选列表
      * @param dataIndex 待选开始索引
      * @param resultList 前面(resultIndex-1)个的组合结果
      * @param resultIndex 选择索引,从0开始
      */
     private static void combinationSelect(String[] dataList, int dataIndex, String[] resultList, int resultIndex) {
         int resultLen = resultList.length;
         int resultCount = resultIndex + 1;
         if (resultCount > resultLen) { // 全部选择完时,输出组合结果
             System.out.println(Arrays.asList(resultList));
             return;
         }
         // 递归选择下一个
         for (int i = dataIndex; i < dataList.length + resultCount - resultLen; i++) {
             resultList[resultIndex] = dataList[i];
             combinationSelect(dataList, i + 1, resultList, resultIndex + 1);
         }
     }
     public static void main(String[] args) {
         String[] array = new String[4];
         array[0] = "SG614111010000000010001";
         array[1] = "SG614111020000000020001";
         array[2] = "SG614111030000000030001";
         array[3] = "SG614111040000000040001";
         /**
          * 测试排列
          */
         System.out.println("测试排列:");
         arrangementSelect(array, array.length);
         /**
          * 测试组合
          */
         System.out.println("测试组合:");
         for(int i = 1; i <= array.length; i++){
             combinationSelect(array, i);
         }
     }
 }
二.结果
测试排列:
A(4, 4) = 24
[SG614111010000000010001, SG614111020000000020001, SG614111030000000030001, SG614111040000000040001]
[SG614111010000000010001, SG614111020000000020001, SG614111040000000040001, SG614111030000000030001]
[SG614111010000000010001, SG614111030000000030001, SG614111020000000020001, SG614111040000000040001]
[SG614111010000000010001, SG614111030000000030001, SG614111040000000040001, SG614111020000000020001]
[SG614111010000000010001, SG614111040000000040001, SG614111020000000020001, SG614111030000000030001]
[SG614111010000000010001, SG614111040000000040001, SG614111030000000030001, SG614111020000000020001]
[SG614111020000000020001, SG614111010000000010001, SG614111030000000030001, SG614111040000000040001]
[SG614111020000000020001, SG614111010000000010001, SG614111040000000040001, SG614111030000000030001]
[SG614111020000000020001, SG614111030000000030001, SG614111010000000010001, SG614111040000000040001]
[SG614111020000000020001, SG614111030000000030001, SG614111040000000040001, SG614111010000000010001]
[SG614111020000000020001, SG614111040000000040001, SG614111010000000010001, SG614111030000000030001]
[SG614111020000000020001, SG614111040000000040001, SG614111030000000030001, SG614111010000000010001]
[SG614111030000000030001, SG614111010000000010001, SG614111020000000020001, SG614111040000000040001]
[SG614111030000000030001, SG614111010000000010001, SG614111040000000040001, SG614111020000000020001]
[SG614111030000000030001, SG614111020000000020001, SG614111010000000010001, SG614111040000000040001]
[SG614111030000000030001, SG614111020000000020001, SG614111040000000040001, SG614111010000000010001]
[SG614111030000000030001, SG614111040000000040001, SG614111010000000010001, SG614111020000000020001]
[SG614111030000000030001, SG614111040000000040001, SG614111020000000020001, SG614111010000000010001]
[SG614111040000000040001, SG614111010000000010001, SG614111020000000020001, SG614111030000000030001]
[SG614111040000000040001, SG614111010000000010001, SG614111030000000030001, SG614111020000000020001]
[SG614111040000000040001, SG614111020000000020001, SG614111010000000010001, SG614111030000000030001]
[SG614111040000000040001, SG614111020000000020001, SG614111030000000030001, SG614111010000000010001]
[SG614111040000000040001, SG614111030000000030001, SG614111010000000010001, SG614111020000000020001]
[SG614111040000000040001, SG614111030000000030001, SG614111020000000020001, SG614111010000000010001]
测试组合:
C(4, 1) = 4
[SG614111010000000010001]
[SG614111020000000020001]
[SG614111030000000030001]
[SG614111040000000040001]
C(4, 2) = 6
[SG614111010000000010001, SG614111020000000020001]
[SG614111010000000010001, SG614111030000000030001]
[SG614111010000000010001, SG614111040000000040001]
[SG614111020000000020001, SG614111030000000030001]
[SG614111020000000020001, SG614111040000000040001]
[SG614111030000000030001, SG614111040000000040001]
C(4, 3) = 4
[SG614111010000000010001, SG614111020000000020001, SG614111030000000030001]
[SG614111010000000010001, SG614111020000000020001, SG614111040000000040001]
[SG614111010000000010001, SG614111030000000030001, SG614111040000000040001]
[SG614111020000000020001, SG614111030000000030001, SG614111040000000040001]
C(4, 4) = 1
[SG614111010000000010001, SG614111020000000020001, SG614111030000000030001, SG614111040000000040001]
代码实现排列组合【Java】的更多相关文章
- 用js实现排列组合
		
在leetcode上看到一个题,代码实现排列组合的. 记得大学上课时候,就用c写过,现在用js试试,顺便看看耗时. 先看看3的阶乘: function permute(temArr,testArr){ ...
 - java实现排列组合(通俗易懂)
		
个人感觉这篇文章(原文地址见文章尾)写的排列组合问题,非常的好,而且是一步一步引出排列组合问题,我也是看了这篇文章,一步一步按照这个思路来,最后会了自己的一套排列组合 也因此在算法竞赛中,两次用到了, ...
 - Java蓝桥杯——排列组合
		
排列组合介绍 排列,就是指从给定n个数的元素中取出指定m个数的元素,进行排序. 组合,则是指从给定n个数的元素中仅仅取出指定m个数的元素,不考虑排序. 全排列(permutation) 以数字为例,全 ...
 - HDU 4045 Machine scheduling (组合数学-斯特林数,组合数学-排列组合)
		
Machine scheduling Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
 - 数组排列组合问题——BACKTRACKING
		
BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...
 - 给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合
		
给定数组a[1,2,3],用a里面的元素来生成一个长度为5的数组,打印出其排列组合 ruby代码: def all_possible_arr arr, length = 5 ret = [] leng ...
 - LeetCode 77 Combinations(排列组合)
		
题目链接:https://leetcode.com/problems/combinations/#/description Problem:给两个正数分别为n和k,求出从1,2.......n这 ...
 - hdu 4451 Dressing 排列组合/水题
		
Dressing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
 - LeetCode OJ:Combinations (排列组合)
		
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exampl ...
 
随机推荐
- git解决error: The following untracked working tree files would be overwritten by checkout
			
在IDEA中进行分支切换时,出现如此错误,导致无法正常切换:error: The following untracked working tree files would be overwritten ...
 - Mybatis出错: Cause: org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.cyf.pojo.User with invalid types () or values ()
			
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache.ib ...
 - Katalon studio登陆并进行用户名和密码参数化
			
前面步骤不截图了,简单说一下: 1.创建空的test case :login 2.点击record录制脚本,走登陆 3.生成的脚本后,点击login用例属性,新建2个变量值 4.创建好后,进入用例页面 ...
 - Kubernetes k8s 基于Docker For Windows
			
开启和安装Kubernetes k8s 基于Docker For Windows 0.最近发现,Docker For Windows Stable在Enable Kubernetes这个问题上 ...
 - 浅谈MVC、MVVM的区别
			
一.概述 MVC,MVP,MVVM是三种常见的前端架构模式(Architectural Pattern),它通过分离关注点来改进代码组织方式.不同于设计模式(Design Pattern),只是为了解 ...
 - Scratch学习中需要注意的地方,学习Scratch时需要注意的地方
			
在所有的编程工具中,Scratch是比较简单的,适合孩子学习锻炼,也是信息学奥赛的常见项目.通常Scratch学习流程是,先掌握程序相关模块,并且了解各个模块的功能使用,然后通过项目的编写和练习,不断 ...
 - Delphi编码与签名【URL编码与解码,Base64编码与解码,MD5加密,HMAC-SHA1、HMAC-SHA224、HMAC-SHA256、HMAC-SHA384和HMAC-SHA512签名】
			
作者QQ:(648437169) 点击下载➨delphi编码与签名 [Delphi编码与签名]URL编码与解码,Base64编码与解码,MD5加密,HMAC-SHA1.HMAC-SHA224.HMAC ...
 - select中的option被选中时页面的跳转
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - ComPtr的介绍以及使用
			
ComPtr是为COM而设计的智能指针.它支持WindowsRT,也支持传统Win32.相比ATL里的CComPtr类,它有了一些提升. ComPtr包含在Windows 8.x SDK and Wi ...
 - 1、Linux安装前的准备
			
1.硬盘和分区 1.1 Linux中如何表示硬盘和分区 硬盘划分为 主分区.扩展分区和逻辑分区三部分. 主分区只有四个: 扩展分区可以看成是一个特殊的主分区类型,在扩展分区中还可以建立相应的逻辑分区 ...