java实现:从26个字目中任取5个字母,排列组合出所有的可能,打印出来

一个排列组合问题。求算法。
就是从26个字母中,任意取出5个字母。然后,这5个字母排序,排序把所有的可能都排到。
26个字母,任意5个字母都这么排。
这个算法怎么实现呢?谢谢大家。给30分。

package baidu.testTwo;

public class Sort {
private static char[] NUM = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
'W', 'X', 'Y', 'Z' };// 所有的字母数

public char[] randNum(int num) {// 随机选取num个数
char[] s = new char[num];// 定就num个长度的字符数组
int i = 0;// 计算循环数
int n = 0;// 控制循环
while (i < num) {
char c = NUM[(int) (Math.random() * NUM.length)];// 随机出一个字符,将其赋给c
for (int j = 0; j < s.length; j++) {// 这个循环是除去重的字符
if (s[j] == c)
{// 如果有重复的则终止循环
n = 1;// 将n=1
break;// 终止for循环
}
}

if (n == 1) { // 如果n==1,则进入下一个while循环
n = 0; // 将n还原 n=0;
continue; // 进入下一循环
} else { // 如果n不等于1,刚将字符c赋给s[i]
n = 0; // 将n还原 n=0;
s[i] = c; // 将字符c赋给s[i]
i++;
}

}

return s;// 返回含有num个不重复的字符数组
}

public void sortNum(int num) {//排列出所有的可能
char[] s = randNum(num).clone();//clone一个randNum(num);
System.out.println("***" + s.length);//打印s的长度
for (int i = 0; i < s.length; i++) {//排列循环

for (int j = 0; j < s.length - 1; j++) {
char t;
t = s[j];
s[j] = s[j + 1];
s[j + 1] = t;
for (int m = 0; m < s.length; m++) {//打印排列
System.out.print(s[m]);
}
System.out.println();
}

}
}

public static void main(String[] a) {
Sort s = new Sort();
s.sortNum(5);
}
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-06-26
//获得不重复的随机数数组,取值范围[min,max),个数size
public static int[] getRandomIntWithoutReduplicate( int min, int max, int size )
{
int[] result = new int[size];//用于存储结果的数组

int arraySize = max - min;//用于放"牌"的数组大小
int[] intArray = new int[arraySize];//用于放"牌"的数组
// 初始化"牌盒",比如取值范围是[3,10)则"牌盒"里放的"牌"就是3,4,5,6,7,8,9
for( int i = 0 ; i < intArray.length ; i++ )
{
intArray[i] = i + min;
}
// 获取不重复的随机数数组
for( int i = 0 ; i < size ; i++ )
{
int c = getRandomInt( min, max - i );//获取到一个随机数
int index = c - min;//这个随机数在"牌盒"里的位置
swap( intArray, index, arraySize - 1 - i );//将这张"牌"放到"牌盒"的最后面
result[i] = intArray[ arraySize - 1 - i ];//把这张"牌"的值扔到存储结果的数组里
}
return result;
}
//获取随机数,随机数取值范围为[min, max)
public static int getRandomInt( int min, int max )
{
// include min, exclude max
int result = min + new Double( Math.random() * ( max - min ) ).intValue();
System.out.println(result);
return result;
}

private static void swap( int[] array, int x, int y )
{//交换数组arry, 序号x与序号y值的顺序
int temp = array[x];
array[x] = array[y];
array[y] = temp;
}

方法 getRandomIntWithoutReduplicate( int min, int max, int size )
中 min=1 max=26 size=5
数字1到26就表示的26个字母

可以给分了吧

也有简单点的
List<Integer> box = new ArrayList<Integer>();
for(int i=0; i < 36; ++i){
box.add(i+1);
}

Collections.shuffle(box);

return box.subList(0,4);

List<Integer> box = new ArrayList<Integer>();
for(int i=1; i < 26; ++i){
box.add(i);
}

Collections.shuffle(box);

return box.subList(0,4);

借助Collections内置的shuffle(洗牌)之后,取前五个就可以了

参考资料:http://www.javaeye.com/topic/211491

第2个回答  2009-06-26
到底是按排列,还是按组合

数学上,排列和组合是不一样的结果。。

结果的个数

就是 排列(26选5)数学上有公式

用程序实现,只能一步一步取可能出现的结果,。。这都是数学问题!
第3个回答  2009-06-26
晕死。。问题越来越简单。。不答了
相似回答