参数的排列组合2

参数的排列组合2
参数的取值范围是:[“a”,”b”,”c”,”d”],求其所有的排列组合
先给出答案:
共15个,分别是:
abc, d, abd, b, c, a, ac, ad, bcd, ab, bc, acd, abcd, bd, cd

单元测试:

    @Test
    public void test_factorialaa(){
        String base[]=new String[]{"a","b","c","d"};
        Set<String>result=AssembleUtil.assemble( base, 0, base.length,true);
        System.out.println(result.size());
        System.out.println(result);
    }

核心代码:

package com.common.util;

import com.string.widget.util.ValueWidget;

import java.util.HashSet;
import java.util.Set;

/**
 * Created by huangweii on 2016/1/23.
 */
public class AssembleUtil {
    /***
     *
     * @param base :[a,b,c,d]
     * @param times
     * @param remaining : 剩余要选择的个数
     * @return
     */
    public static void assemble(Set<String> result, StringBuffer buffer, String base[], int times, int remaining, boolean isSort){
        if(remaining<=1){
            buffer.append(base[base.length-1]);
            addElementBySort(result, buffer, isSort);
        }else{
            for(int i=0;i<remaining;i++){
                StringBuffer bufferTmp=new StringBuffer(buffer);
                bufferTmp.append(base[base.length-1-i]);
                addElementBySort(result, bufferTmp, isSort);
                assemble(result,bufferTmp, SystemHWUtil.aheadElement(base,base.length-1-i), times, remaining-1,isSort);
            }
        }

    }

    /***
     *
     * @param base
     * @param times
     * @param remaining : 剩余要选择的个数
     * @param isSort : 是否对"acb"进行排序,<br />排序结果:"abc"
     * @return
     */
    public static Set<String> assemble( String base[], int times, int remaining, boolean isSort){
        Set<String>result=new HashSet<String>();
        StringBuffer buffer=new StringBuffer();
        AssembleUtil.assemble(result,new StringBuffer(), base, 0, base.length,true);
        return result;
    }
    public static void addElementBySort(Set<String> result, StringBuffer buffer, boolean isSort) {
        String str=buffer.toString();
        if(isSort){
            str= ValueWidget. sortStr(str);
        }
        result.add(str);
    }
    /***
     * 参数的取值个数,ab和ba算一种
     * @param argCount
     * @return
     */
    public static int getAssembleSum(int argCount){
        int sum=0;
        for(int i=0;i<argCount;i++){
            int count=i+1;//参数组合的个数
            sum+=(SystemHWUtil. factorial(argCount,count)/SystemHWUtil.arrayArrange(count));
        }
        return sum;
    }

}
时间: 2024-08-31 21:10:07

参数的排列组合2的相关文章

参数的排列组合

参数的排列组合 比如一个参数的取值范围是[a,b,c,d],那么有哪些组合呢? 个数 取值可能 组合的个数 一个值 a,b,c,d 4 两个值 ab,ac,ad,bc,bd,cd 6 三个值 无a,无b,无c,无d 4 四个值 abcd 1 如果ab,和ba算不同,那么有多少种可能呢? 个数 取值可能(factorial) 排列组合的个数 重复的遍数(ab和ba算重复) 一个值 4 4 1个元素的排列(1的阶乘) 两个值 4*3 12 2个元素的排列(2的阶乘) 三个值 4*3*2 24 3个元

java算法-求可变参数的排列组合代码思想?就是 m从选n个 作为组合 m是可变的 n也是?如何解

问题描述 求可变参数的排列组合代码思想?就是 m从选n个 作为组合 m是可变的 n也是?如何解 求可变参数的排列组合代码思想?就是 m从选n个 作为组合 m是可变的 n也是?如何解 解决方案 这个简单,就是递归. 从m选n的算法可以分解为 for each 遍历m,选取1个+ (从剩下的m-1个元素中任选n-1个) 直到从1个元素中选择1个.

参数的排列组合3

如何获取排列组合的所有值呢? 之前咱们是求排列组合的取值个数,现在要求取值 首先我们考虑常规的情况: 我们有n个盒子,分别放置n个元素 第一回:我们从n个里面选择一个:有n种可能 第二回:我们从n-1个里面选择一个:有n-1种可能 第三回:我们从n-2个里面选择一个:有n-2种可能 第四回:我们从n-3个里面选择一个:有n-3种可能 -- 最后我们只有一个可选 直接上代码: /*** * @param base :[a,b,c,d] * @param times * @param remaini

浅析实现排列组合查询算法

所谓的排列组合查询就相当于GOOGLE高级查询中"包含以下全部的字词"查询,也就是说查询中必须包含所有查询关键词,而且他们的顺序可以是任意.以下程序段实现了这一功能.比如输入查询关键字:tom tina则最一般的情况是在程序中使用类似于"select sex from student where name like '%tom%tina%' or name like '%tina%tom%' ordered by age" 的查询语句实现以上的查询,因此如何得到'%

.NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几篇文章推荐给大家.最近在计算足球彩票结果组合过程中,使用的到了其功能,生成排列,非常具有代表性,而且也有网友咨询过类似的问题,所以就封装为扩展方法,方便调用.         NET开源目录:[目录]本博客其他.NET开源项目文章目录 彩票数据资料目录:[目录]C#搭建足球赛事资料库与预测平

【原创】开源.NET排列组合组件KwCombinatorics使用(一)—组合生成

       本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1.[原创]开源.NET排列组合组件KwCombinatorics使用(一)-组合生成  2.[原创]开源.NET排列组合组件KwCombinatorics使用(二)--排列生成 3.[原创]开源.NET排列组合组件KwCombinatorics使用(三)--笛卡尔积组合 前言 本文今天介绍的.NET开

【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成

       本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1.[原创]开源.NET排列组合组件KwCombinatorics使用(一)-组合生成  2.[原创]开源.NET排列组合组件KwCombinatorics使用(二)--排列生成 3.[原创]开源.NET排列组合组件KwCombinatorics使用(三)--笛卡尔积组合 前言 本文今天介绍的.NET开

【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合

       本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1.[原创]开源.NET排列组合组件KwCombinatorics使用(一)-组合生成  2.[原创]开源.NET排列组合组件KwCombinatorics使用(二)--排列生成 3.[原创]开源.NET排列组合组件KwCombinatorics使用(三)--笛卡尔积组合   前言 本文今天介绍的.NE

C语言实现的排列组合问题的通用算法、解决方法_C 语言

尽管排列组合是生活中经常遇到的问题,可在程序设计时,不深入思考或者经验不足都让人无从下手.由于排列组合问题总是先取组合再排列,并且单纯的排列问题相对简单,所以本文仅对组合问题的实现进行详细讨论.以在n个数中选取m(0<m<=n)个数为例,问题可分解为: 1. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止. 2. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m. 很明显,上述方法是一个递归的过程,也