java java排列组合m取n(很急,谢谢了)

JAVA获得一个数组的指定长度的排列组合
我的图书馆
JAVA获得一个数组的指定长度的排列组合
关键字: 转载自http://www.java2000.net/题目,得到某个数组,比如【1,2,3】 获得其全部的排列组合,包括1个数字的。2个数字的,和三个数字的等等。&&Java代码&import&java.util.S&&&&&&&&&&public&class&TestSequenceAll&{&&&&public&static&void&main(String[]&args)&{&&&&&&TestSequenceAll&t&=&new&TestSequenceAll();&&&&&&Object[]&arr&=&{&1,&2,&3&};&&&&&&&&&&&&for&(int&num&=&1;&num&&=&arr.&num++)&{&&&&&&&&t.getSequence(arr,&0,&num);&&&&&&}&&&&}&&&&&&&&&&private&Stack&Object&&stack&=&new&Stack&Object&();&&&&&&&&&&&&&&&&public&void&getSequence(Object[]&arr,&int&begin,&int&num)&{&&&&&&if&(num&==&0)&{&&&&&&&&System.out.println(stack);&&&&&&&}&else&{&&&&&&&&&&&&&&&&for&(int&i&=&&i&&&arr.&i++)&{&&&&&&&&&&&&&&&&&&&&stack.push(arr[i]);&&&&&&&&&&&&&&&&&&&&swap(arr,&begin,&i);&&&&&&&&&&&&&&&&&&&&getSequence(arr,&begin&+&1,&num&-&1);&&&&&&&&&&&&&&&&&&&&swap(arr,&begin,&i);&&&&&&&&&&&&&&&&&&&&stack.pop();&&&&&&&&}&&&&&&}&&&&}&&&&&&&&&&&&&&&&public&static&void&swap(Object[]&arr,&int&from,&int&to)&{&&&&&&if&(from&==&to)&{&&&&&&&&return;&&&&&&}&&&&&&Object&tmp&=&arr[from];&&&&&&arr[from]&=&arr[to];&&&&&&arr[to]&=&&&&&}&&}&&运行结果&[1]&[2]&[3]&[1, 2]&[1, 3]&[2, 1]&[2, 3]&[3, 2]&[3, 1]&[1, 2, 3]&[1, 3, 2]&[2, 1, 3]&[2, 3, 1]&[3, 2, 1]&[3, 1, 2]&
TA的推荐TA的最新馆藏[转]&[转]&
喜欢该文的人也喜欢1120人阅读
《算法的乐趣》(13)
因为准备要做一道多维穷举算法题,所以必须要补一下排列组合的算法知识,本来我刚接触多维穷举算法的时候,还以为难点只是要找出如何判断穷举结果是否合法。
但是想开始写算法的时候,才发现多维穷举本身也是一大难点,至少对于像我这样刚开始接触算法的小白,排列组合根本是很难想出来如何实现。
于是我百度了一下,找到了排列组合算法的java实现版,现在特意把它搬出来,分享给大家。
public class Test {
public static char[] text = { 'a', 'b', 'c', 'd' , 'e'};
public static void main(String[] args) {
permutation(text, 0, text.length);
System.exit(0);
* 全排列输出
* @param a[] 要输出的字符数组
* @param m 输出字符数组的起始位置
* @param n 输出字符数组的长度
public static void permutation(char a[], int m, int n) {
if (m & n - 1) {
permutation(a, m + 1, n);
for (i = m + 1; i & i++) {
a[m] = a[i];
permutation(a, m + 1, n);
a[m] = a[i];
printResult(a);
* 输出指定字符数组
* @param text 将要输出的字符数组
public static void printResult(char[] text) {
for (int i = 0; i & text. i++) {
System.out.print(text[i]);
System.out.println();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:133035次
积分:2870
积分:2870
排名:第12328名
原创:131篇
评论:14条
(1)(1)(1)(8)(7)(2)(1)(18)(3)(23)(32)(21)(4)(10)java实现排列组合 -
- ITeye博客
博客分类:
这里就直接贴代码了
package mon.util.
import java.util.ArrayL
import java.util.L
import com.mon.exception.BussinessE
* 统计任三出现的最多的几率的组合
* @author lh
public class Copy2OfStatisAnyThree {
// 组合算法
// 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
// 代表的数被选中,为0则没选中。
// 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
// 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为
// “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
// 当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得
// 到了最后一个组合。
// 例如求5中选3的组合:
// 1 1 1 0 0 //1,2,3
// 1 1 0 1 0 //1,2,4
// 1 0 1 1 0 //1,3,4
// 0 1 1 1 0 //2,3,4
// 1 1 0 0 1 //1,2,5
// 1 0 1 0 1 //1,3,5
// 0 1 1 0 1 //2,3,5
// 1 0 0 1 1 //1,4,5
// 0 1 0 1 1 //2,4,5
// 0 0 1 1 1 //3,4,5
public static void main(String[] args) {
Copy2OfStatisAnyThree s = new Copy2OfStatisAnyThree();
s.printAnyThree();
public void printAnyThree() {
int[] num = new int[] {0, 1, 2, 3, 4, 5 };//,
print(combine(num, 4));
* 从n个数字中选择m个数字
* @param a
* @param m
public List combine(int[] a, int m) {
int n = a.
if (m & n) {
throw new BussinessException("错误!数组a中只有" + n + "个元素。" + m + "大于" + 2 + "!!!");
List result = new ArrayList();
int[] bs = new int[n];
for (int i = 0; i & i++) {
bs[i] = 0;
for (int i = 0; i & i++) {
bs[i] = 1;
boolean flag =
boolean tempFlag =
int pos = 0;
int sum = 0;
// 首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
tempFlag =
result.add(print(bs, a, m));
for (int i = 0; i & n - 1; i++) {
if (bs[i] == 1 && bs[i + 1] == 0) {
bs[i] = 0;
bs[i + 1] = 1;
// 将左边的1全部移动到数组的最左边
for (int i = 0; i & i++) {
if (bs[i] == 1) {
for (int i = 0; i & i++) {
if (i & sum) {
bs[i] = 1;
bs[i] = 0;
// 检查是否所有的1都移动到了最右边
for (int i = n - i & i++) {
if (bs[i] == 0) {
tempFlag =
if (tempFlag == false) {
} while (flag);
result.add(print(bs, a, m));
private int[] print(int[] bs, int[] a, int m) {
int[] result = new int[m];
int pos = 0;
for (int i = 0; i & bs. i++) {
if (bs[i] == 1) {
result[pos] = a[i];
private void print(List l) {
for (int i = 0; i & l.size(); i++) {
int[] a = (int[]) l.get(i);
for (int j = 0; j & a. j++) {
System.out.print(a[j] + "\t");
System.out.println();
package mon.util.
import java.util.ArrayL
import java.util.L
import com.mon.exception.BussinessE
* 排列组合工具类
* @version 3.0
* @author lh
* @date 日
public class PermutationUtils {
static final int [] NUM_1 = {1};
static final int [] NUM_2 = {1, 2};
static final int [] NUM_3 = {1, 2, 3};
static final int [] NUM_4 = {1, 2, 3, 4};
static final int [] NUM_5 = {1, 2, 3, 4, 5};
static final int [] NUM_6 = {1, 2, 3, 4, 5, 6};
static final int [] NUM_7 = {1, 2, 3, 4, 5, 6, 7};
static final int [] NUM_8 = {1, 2, 3, 4, 5, 6, 7, 8};
static final int [] NUM_9 = {1, 2, 3, 4, 5, 6, 7, 8, 9};
* 排列组合计算
* @author lh
* @date 日
* @param count 组合元素数量
@SuppressWarnings({ "rawtypes", "unchecked" })
public static List calculate(int count){
if(count & 9){
throw new BussinessException("Currently does not support large digits");
int [] numdefault = getNumDefault(count);
int [] numarray = new int[count];
switch (count) {
numarray = NUM_1;
numarray = NUM_2;
numarray = NUM_3;
numarray = NUM_4;
numarray = NUM_5;
numarray = NUM_6;
numarray = NUM_7;
numarray = NUM_8;
numarray = NUM_9;
Copy2OfStatisAnyThree s = new Copy2OfStatisAnyThree();
List list = new ArrayList();
list.add(numdefault);
for (int i = 1; i & i++) {
list.addAll( bine(numarray, i), count));
list.add(numarray);
* 重新归位
* @author lh
* @date 日
* @param l
* @param numdefault
* @param len
@SuppressWarnings({ "rawtypes", "unchecked" })
private static List reset(List l, int len) {
List list = new ArrayList();
for (int i = 0; i & l.size(); i++) {
int[] b = getNumDefault(len);
int[] a = (int[]) l.get(i);
for (int j : a) {
b[j - 1] =
list.add(b);
* 给定数组默认值
* @author lh
* @date 日
* @param count
public static int[] getNumDefault(int count){
int[] b = new int [count];
for (int k = 0; k & b. k++) {
测试用例如下:
package mon.util.
import java.util.L
import org.junit.T
public class PermutationUtilsTest {
* 排列组合
* @author LH
* @date 日
@SuppressWarnings("rawtypes")
public void testPermutation() {
int count = 4;
System.out.println(Math.pow(2d, Double.valueOf(count)));
List list = PermutationUtils.calculate(count);
System.out.println("list.size=" + list.size());
print(list);
@SuppressWarnings("rawtypes")
private static void print(List l) {
for (int i = 0; i & l.size(); i++) {
int[] a = (int[]) l.get(i);
for (int j = 0; j & a. j++) {
System.out.print(a[j] + "\t");
System.out.println();
浏览: 297401 次
来自: 杭州
com.mon.util 这个包下的工 ...
q 写道原来就支持自定义不同时长的cac ...
原来就支持自定义不同时长的cache的吧配置cachemana ...
我看没生效也是这样,更新下spring boot版本试试
牛X,我服。排列组合算法(JAVA实现) -
- ITeye博客
博客分类:
组合算法实现
从m个数里面取n个数的算法。最容易理解的就是递归,但是其效率太低。 实现方法一: // 组合算法 // 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标 // 代表的数被选中,为0则没选中。 // 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。 // 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为 // “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。 // 当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得 // 到了最后一个组合。 // 例如求5中选3的组合: // 1 1 1 0 0 //1,2,3 // 1 1 0 1 0 //1,2,4 // 1 0 1 1 0 //1,3,4 // 0 1 1 1 0 //2,3,4 // 1 1 0 0 1 //1,2,5 // 1 0 1 0 1 //1,3,5 // 0 1 1 0 1 //2,3,5 // 1 0 0 1 1 //1,4,5 // 0 1 0 1 1 //2,4,5 // 0 0 1 1 1 //3,4,5 import java.util.ArrayL import java.util.L /** * 面试中遇到的问题,在网上查找资料,加上自己的总结, java 代码实现组合的算法 * 从n个数里取出m个数的组合是n*(n-1)*...*(n-m+1)/m*(m-1)*...2*1 该方法比较好理解,但具体算法的分析却有难度。 * * @date
* */ class Zuhe1 { /** * @param a:组合数组 * @param k:生成组合个数 * @return :所有可能的组合数组列表 */ private List zuhe(int[] a, int m) {
Zuhe1 zuhe = new Zuhe1();
List list = new ArrayList();
int n = a.
boolean flag = // 是否是最后一种组合的标记
// 生成辅助数组。首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
int[] tempNum = new int[n];
for (int i = 0; i & i++) {
if (i & m) {
tempNum[i] = 1;
tempNum[i] = 0;
System.out.print(tempNum[i]);
print(tempNum);// 打印辅助数组
list.add(zuhe.createResult(a, tempNum, m));// 打印第一中默认组合
int pose = 0; // 记录改变的位置
int sum = 0; // 记录改变位置 左侧 1 的个数
// 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”
for (int i = 0; i & (n - 1); i++) {
if (tempNum[i] == 1 && tempNum[i + 1] == 0) {
tempNum[i] = 0;
tempNum[i + 1] = 1;
print(tempNum);// 打印辅助数组
list.add(zuhe.createResult(a, tempNum, m));// 打印第一中默认组合
// 同时将其左边的所有“1”全部移动到数组的最左端。
for (int i = 0; i & i++) {
if (tempNum[i] == 1)
for (int i = 0; i & i++) {
if (i & sum)
tempNum[i] = 1;
tempNum[i] = 0;
// 判断是否为最后一个组合:当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。
for (int i = n - i & i++) {
if (tempNum[i] == 0)
} while (flag);
} // 根据辅助数组和原始数组生成 结果数组 public int[] createResult(int[] a, int[] temp, int m) {
int[] result = new int[m];
int j = 0;
for (int i = 0; i & a. i++) {
if (temp[i] == 1) {
result[j] = a[i];
System.out.println("result[" + j + "]:" + result[j]);
} // 打印 public void print1(List list) {
for (int i = 0; i & list.size(); i++) {
System.out.println();
int[] temp = (int[]) list.get(i);
for (int j = 0; j & temp. j++) {
System.out.print(temp[j] + " ");
} } // 打印整数数组的方法 public void print(int[] a) {
System.out.println("生成的辅助数组为:");
for (int i = 0; i & a. i++) {
System.out.print(a[i]);
System.out.println(); } public static void main(String[] args) {
int[] a = { 1, 2, 3, 4, 5 }; // 整数数组
int m = 3; // 待取出组合的个数
Zuhe1 zuhe = new Zuhe1();
List list = zuhe.zuhe(a, m);
zuhe.print1(list); } } 实现方法二:使用递归算法,但比较难于理解,摘自网上,慢慢消化 /** * 从n个数里取出m个数的组合是n*(n-1)*...*(n-m+1)/m*(m-1)*...2*1 */ import java.io.*; public class Test1 { public static void main(String[] args) {
select(2); }
private static void select(int k) {
char[] result = new char[k];
subselect(0, 1, result, k); }
private static void subselect(int head, int index, char[] r, int k) {
for (int i = i & a.length + index - i++) {
if (index & k) {
r[index - 1] = a[i];
System.out.println("i="+(i)+";index="+(index));
subselect(i + 1, index + 1, r, k);
} else if (index == k) {
r[index - 1] = a[i];
System.out.println(";i="+(i)+";index="+(index)+";index==k:"+(index==k));
System.out.print(i+"===");
System.out.println(r);
subselect(i + 1, index + 1, r, k);
System.out.println("++"); //返回到何处?奇怪
} } private static char[] a = { 'a', 'b', 'c' }; }
浏览 40435
liyuandong
浏览: 245766 次
来自: 北京
相关实现比较繁琐,有兴趣的朋友可以看看我的博客《用Java实现 ...
很好,谢谢了
写得非常详细
感觉帆软报表这些采用的flash打印方式很不错啊

我要回帖

更多关于 java 多数组 排列组合 的文章

 

随机推荐