Re:大家都来做一做这题,看谁的最简单明了 Java题目: 用1,2,2,3,4,5这六个数字,写一个方法,打印出所有不同的排列,要求:4不能在第三位,3和5不能相连 看看谁的方法最简单,最容易理解.最好有注释 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public static void perm(char[] buf,int start,int end){ if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可 for(int i=0;i<=end;i++){ System.out.print(buf[i]); } System.out.println(); } else{//多个字母全排列 for(int i=start;i<=end;i++){ char temp=buf[start];//交换数组第一个元素与后续的元素 buf[start]=buf[i]; buf[i]=temp; printArray(buf); perm(buf,start+1,end);//后续元素递归全排列 temp=buf[start];//将交换后的数组还原 buf[start]=buf[i]; buf[i]=temp; printArray(buf); } } } 这个是递归实现的无任何限制的全排列 你只要在在第一个if判断中加上你的那两个条件就可以了 最好用递归进行排列数组,然后用容器Set自动去除重复的序列。代码如下:import java.util.HashSet;import java.util.Set;public class Test { public static Set<String> set = new HashSet<String>(); // 用set存储所有符合条件的排列组合,可以看自动去除重复 public static void range(char[] buf, int start, int end) { if (start == end) { String str = new String(buf); // 将当前字符数组转换为String if(buf[2] != '4' && str.indexOf("35") == -1 && str.indexOf("53") == -1){ // 限制条件4不能在第三位,3和5不能相连 set.add(str); } } else { for (int i = start; i <= end; i++) { char temp = buf[start]; // 交换数组第一个元素与后续的元素 buf[start] = buf[i]; buf[i] = temp; range(buf, start + 1, end); // 后续元素递归全排列 temp = buf[start]; // 将交换后的数组还原 buf[start] = buf[i]; buf[i] = temp; } } } public static void main(String[] args) { // TODO Auto-generated method stub char[] buf = { '1', '2', '2','3','4','5'}; range(buf, 0, 5); for(String s:set){ // 用for打印出set中的所有记录 System.out.println(s); } System.out.print("一共有 " + set.size() + " 各符合条件的组合"); }}输出:…………521432342512423152212345542231432152251423一共有 198 各符合条件的组合 怎么老是这种错误,A class file was not written. swing 程序如何访问URL地址 一个一直困惑着我的问题! 大专程序员交流群 GEF的api谁有呀,谢谢! JFileChooser的打开文件对话框如何做成模态对话框? 关于super关键字的疑惑 java生成jpeg/png图片时,如何设置图片质量? [急问]关于大数据量文件读写的问题 谁能提供《Applying UML and Patterns》下载链接? 太失望了,csdn上就没有人会这个问题。以后不少啦吧,多去javaeye 请教一个上转型对象的问题
if(start==end){//当只要求对数组中一个字母进行全排列时,只要就按该数组输出即可
for(int i=0;i<=end;i++){
System.out.print(buf[i]);
}
System.out.println();
}
else{//多个字母全排列
for(int i=start;i<=end;i++){
char temp=buf[start];//交换数组第一个元素与后续的元素
buf[start]=buf[i];
buf[i]=temp;
printArray(buf);
perm(buf,start+1,end);//后续元素递归全排列
temp=buf[start];//将交换后的数组还原
buf[start]=buf[i];
buf[i]=temp;
printArray(buf);
}
}
} 这个是递归实现的无任何限制的全排列 你只要在在第一个if判断中加上你的那两个条件就可以了
import java.util.Set;public class Test { public static Set<String> set = new HashSet<String>(); // 用set存储所有符合条件的排列组合,可以看自动去除重复
public static void range(char[] buf, int start, int end) {
if (start == end) {
String str = new String(buf); // 将当前字符数组转换为String
if(buf[2] != '4' && str.indexOf("35") == -1 && str.indexOf("53") == -1){
// 限制条件4不能在第三位,3和5不能相连
set.add(str);
}
}
else {
for (int i = start; i <= end; i++) {
char temp = buf[start]; // 交换数组第一个元素与后续的元素
buf[start] = buf[i];
buf[i] = temp;
range(buf, start + 1, end); // 后续元素递归全排列
temp = buf[start]; // 将交换后的数组还原
buf[start] = buf[i];
buf[i] = temp;
}
}
} public static void main(String[] args) {
// TODO Auto-generated method stub
char[] buf = { '1', '2', '2','3','4','5'};
range(buf, 0, 5);
for(String s:set){ // 用for打印出set中的所有记录
System.out.println(s);
}
System.out.print("一共有 " + set.size() + " 各符合条件的组合");
}}
输出:……
……
521432
342512
423152
212345
542231
432152
251423
一共有 198 各符合条件的组合