关于各种排列组合java算法实现方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于各种排列组合java算法实现方法相关的知识,希望对你有一定的参考价值。
参考技术A一 利用二进制状态法求排列组合 此种方法比较容易懂 但是运行效率不高 小数据排列组合可以使用
复制代码 代码如下: import java util Arrays;//利用二进制算法进行全排列 //count : //count :
public class test public static void main(String[] args) long start=System currentTimeMillis(); count (); long end=System currentTimeMillis(); System out println(end start); private static void count () int[] num=new int [] ; for(int i= ;i<Math pow( );i++) String str=Integer toString(i ); int sz=str length(); for(int j= ;j< sz;j++) str=" "+str; char[] temp=str toCharArray(); Arrays sort(temp); String gl=new String(temp); if(!gl equals(" ")) continue; String result=""; for(int m= ;m<str length();m++) result+=num[Integer parseInt(str charAt(m)+"")]; System out println(result); public static void count () int[] num=new int [] ; int[] ss=new int [] ; int[] temp=new int[ ]; while(temp[ ]< ) temp[temp length ]++; for(int i=temp length ;i> ;i ) if(temp[i]== ) temp[i]= ; temp[i ]++; int []tt=temp clone(); Arrays sort(tt); if(!Arrays equals(tt ss)) continue; String result=""; for(int i= ;i<num length;i++) result+=num[temp[i]]; System out println(result);
二 用递归的思想来求排列跟组合 代码量比较大
复制代码 代码如下: package practice;import java util ArrayList; import java util List;
public class Test
/** * @param args */ public static void main(String[] args) // TODO Auto generated method stub Object[] tmp= ; // ArrayList<Object[]> rs=RandomC(tmp); ArrayList<Object[]> rs=cmn(tmp ); for(int i= ;i<rs size();i++) // System out print(i+"="); for(int j= ;j<rs get(i) length;j++) System out print(rs get(i)[j]+" "); System out println();
// 求一个数组的任意组合 static ArrayList<Object[]> RandomC(Object[] source) ArrayList<Object[]> result=new ArrayList<Object[]>(); if(source length== ) result add(source); else Object[] psource=new Object[source length ]; for(int i= ;i<psource length;i++) psource[i]=source[i]; result=RandomC(psource); int len=result size();//fn组合的长度 result add((new Object[]source[source length ])); for(int i= ;i<len;i++) Object[] tmp=new Object[result get(i) length+ ]; for(int j= ;j<tmp length ;j++) tmp[j]=result get(i)[j]; tmp[tmp length ]=source[source length ]; result add(tmp); return result; static ArrayList<Object[]> cmn(Object[] source int n) ArrayList<Object[]> result=new ArrayList<Object[]>(); if(n== ) for(int i= ;i<source length;i++) result add(new Object[]source[i]); else if(source length==n) result add(source); else Object[] psource=new Object[source length ]; for(int i= ;i<psource length;i++) psource[i]=source[i]; result=cmn(psource n); ArrayList<Object[]> tmp=cmn(psource n ); for(int i= ;i<tmp size();i++) Object[] rs=new Object[n]; for(int j= ;j<n ;j++) rs[j]=tmp get(i)[j]; rs[n ]=source[source length ]; result add(rs); return result;
三 利用动态规划的思想求排列和组合
复制代码 代码如下: package Acm; //强大的求组合数 public class MainApp public static void main(String[] args) int[] num=new int[] ; String str=""; //求 个数的组合个数 // count( str num ); // 求 n个数的组合个数 count ( str num);private static void count (int i String str int[] num) if(i==num length) System out println(str); return; count (i+ str num); count (i+ str+num[i]+" " num);
private static void count(int i String str int[] num int n) if(n== ) System out println(str); return; if(i==num length) return; count(i+ str+num[i]+" " num n ); count(i+ str num n);
下面是求排列
复制代码 代码如下: lishixinzhi/Article/program/Java/JSP/201311/20148
java字母和数字排列组合后
要求0-9、a-z、A-Z一共62个数字和字母排列出所有的可能。例如:0、1、2、3、....0a、.....、012、.....
组合排列问题,用递归思想
1 选出组合
2 全排列(递归)
import java.util.ArrayList;import java.util.List;
public class AllSort
/**
* 从数组中选出所有组合
* @param source
* @param arrayList
* @param num
*/
public static void select(char[] source, List<String> arrayList, int num)
int lg = source.length;
char[] temp = new char[num];
System.arraycopy(source, 0, temp, 0, num);
// 首次填充数组
arrayList.add(new String(temp));
// 逐个(位置)替换方式实现不重复全选
for (int i = num; i < lg; i++)
for (int j = 0; j < num; j++)
char tempChar = temp[j];
temp[j] = source[i];
arrayList.add(new String(temp));
temp[j] = tempChar;
/**
* 全排序
* @param source
* @param start
* @param end
*/
public static void perm(char[] source, int start, int end)
if (start == end) // 递归出口,最简单的情况,只取出1个
for (int i = 0; i <= end; i++)
System.out.print(source[i]);
System.out.println();
else // 多个全排列
for (int i = start; i <= end; i++)
char temp = source[start];// 逐位交换
source[start] = source[i];
source[i] = temp;
perm(source, start + 1, end);// 递归全排列
// 还原,为下个替换做准备
temp = source[start];
source[start] = source[i];
source[i] = temp;
public static void main(String[] args)
//char[] source = \'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'Aa-Zz...\';
char[] source = \'0\', \'1\', \'2\', \'3\', \'4\',\'5\',\'6\',\'7\',\'8\',\'9\' ;
ArrayList<String> list = new ArrayList<String>();
for (int i = 1; i <= source.length; i++)
list.clear();
//选出
select(source, list, i);
System.out.println("===========取出"+i+"个==============");
//排列
for (String str : list)
char[] temp = str.toCharArray();
perm(temp, 0, temp.length - 1);
参考技术A lz的问题没看明白,你可以尝试这样写:
public static final String mixings = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String getRandomStr(int length)
StringBuffer sb = new StringBuffer();
Random random = new Random();
for (int i = 0; i < length; i++)
sb.append(mixings.charAt(random.nextInt(mixings.length())));
return sb.toString();
length是你想要的字符串的长度;你如果想要1-62种长度的话再加一个for循环即可;这个结果可是相当大的,要慎重啊 参考技术B import java.util.ArrayList;
import java.util.List;
/**
* @author lyon_yao
*
*/
public class Test
public static void main(String []a)
List<String> list=new ArrayList<String>();
String value="0123456789abcdefghijklmnopqrstuvwmnxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] chars=value.toCharArray();
for(char c:chars)
list.add(String.valueOf(c));
System.out.println(list);
List<String> result=new ArrayList<String>();
for(char c:chars)
result.add(String.valueOf(c));
new Test().run(list,1);
public void run(List<String> last,int index)
int size = last.size();
for(int j=0;j<size-index;j++)
String temp="";
for(int i=0;i<index&&i+j<size;i++)
temp+=last.get(j+i);
System.out.println(temp);
if(index<size)
run(last,++index);
你测试一下看是要的效果不 参考技术C public class TestPL
static String[] array = "0","1","2","3";
public static void main(String[] args)
for(int i=0;i<array.length;i++)
sort("",i+1);
public static void sort(String leftString, int leftLen)
if(leftLen == 0)
System.out.println(leftString);
return;
for(int i=0;i<array.length;i++)
if(leftString.indexOf(array[i]) != -1)
continue;
else
sort(leftString+array[i],leftLen-1);
如果你要的是排列的话,就是认为12和21是不同的可能,那么上面这段程序就能满足你的需求,自己增加要排列的项就可以了。如果认为12和21是不同的,那么需要一点改动。
参考技术D 62层循环嵌套,或使用递归以上是关于关于各种排列组合java算法实现方法的主要内容,如果未能解决你的问题,请参考以下文章