数字排列问题 用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主怎么不在论坛里查一下以前的帖子啊,已经有N多人问过同样的问题了!再贴一遍,这个可以处理有重复元素的数组(如果只处理无重复的数据只需要调用rank()函数就可以了):import java.util.Set;import java.util.HashSet;public class Test { /** * @param args */ public static void main(String[] args) { int[] a = { 1, 2, 2, 3, 4, 5 }; String str = toOrderString(a); /*将数组的下标值加1组成一个无重复的新数组,如本例为{1, 2, 2, 3, 4, 5} */ Set<String> tempSet = rank(str, "", str.length(), new HashSet<String>()); /* 对下标值加1所组成的数组进行完全排列组合,若只需取部分组合,则将str.length()改为介于0和str.length()之间的任一整数就可以了 */ Set<String> resultSet = getResult(tempSet, a); /* 将排列组合好的各组下标序列值在数组中取相应的元素值 */ System.out.println("There are " + resultSet.size() + " ways to rank the array."); for (String string : resultSet) { System.out.println(string); } } /* 用递归方法对数组的各元素下标值加1进行长度为length的完全排列组合 */ public static Set<String> rank(String s, String temp, int length, Set<String> set) { if (temp.length() == length) { set.add(temp); } else { for (int i = 0; i < s.length(); i++) { if (temp.indexOf(s.charAt(i)) < 0) set = rank(s, temp + s.charAt(i), length, set); } } return set; } public static String toOrderString(int[] a) { String str = new String(""); for (int i = 0; i < a.length; i++) { str += (i + 1); } return str; } /* 将排列组合好的各组下标序列值在数组中取相应的元素值 */ public static Set<String> getResult(Set<String> set, int[] a) { Set<String> tempSet = new HashSet<String>(); String tempStr = new String(""); for (String str : set) { for (int i = 0; i < str.length(); i++) { tempStr += a[Integer.parseInt(str.substring(i, i + 1)) - 1]; } tempSet.add(tempStr); tempStr = ""; } return tempSet; } public static String toString(int[] a) { String str = new String(""); for (int i = 0; i < a.length; i++) { str += a[i]; } return str; }}输出结果:There are 360 ways to rank the array.312254321524254312325412435221212543125234531242124253………… import java.util.*;public class OYL { public static String[] test(String str){ if(str.length()==1){ String[] temp=new String[1]; temp[0]=str; return temp; } if(str.length()==2){ String[] temp=new String[2]; temp[0]=str; temp[1]=str.substring(1, 2)+str.substring(0, 1); return temp; } Set<String> result=new HashSet(); for(int i=0;i<str.length();i++){ String[] temp=test(get(str,i)); for(int j=0;j<temp.length;j++){ result.add(str.substring(i,i+1)+temp[j]); } } String[] answer=new String[result.size()]; Iterator<String> it=result.iterator(); int h=0; while(it.hasNext()){ answer[h]=it.next(); h++; } return answer; } public static String get(String str,int i){ if(i==0) return str.substring(1,str.length()); if(i==str.length()-1) return str.substring(0,str.length()-1); return str.substring(0, i)+str.substring(i+1,str.length()); } public static void main(String[] args){ String str=new String("122345"); String[] result=test(str); for(int i=0;i<result.length;i++){ System.out.println(result[i]); } }}this is mine! 关于java中建立socket的网络联接 请教一个题目,请大家帮忙解决下!谢谢 求解byte转换int,int转换byte 询问 自动走迷宫的问题 关于javabean的问题,这个是什么原因呢? List.removeall的效率问题? 请告诉俺哪错了 关于转义字符串的小问题! 如何处理此错误:java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]没有执行可选特性 where is thinking in java to download?? java如何获取当前数据库编码(在线等) 关于sql server指针回滚问题
import java.util.HashSet;public class Test { /**
* @param args
*/ public static void main(String[] args) {
int[] a = { 1, 2, 2, 3, 4, 5 };
String str = toOrderString(a); /*将数组的下标值加1组成一个无重复的新数组,如本例为{1, 2, 2, 3, 4, 5} */
Set<String> tempSet = rank(str, "", str.length(), new HashSet<String>()); /* 对下标值加1所组成的数组进行完全排列组合,若只需取部分组合,则将str.length()改为介于0和str.length()之间的任一整数就可以了 */
Set<String> resultSet = getResult(tempSet, a); /* 将排列组合好的各组下标序列值在数组中取相应的元素值 */
System.out.println("There are " + resultSet.size() + " ways to rank the array.");
for (String string : resultSet) {
System.out.println(string);
}
} /* 用递归方法对数组的各元素下标值加1进行长度为length的完全排列组合 */
public static Set<String> rank(String s, String temp, int length, Set<String> set) {
if (temp.length() == length) {
set.add(temp);
} else {
for (int i = 0; i < s.length(); i++) {
if (temp.indexOf(s.charAt(i)) < 0)
set = rank(s, temp + s.charAt(i), length, set);
}
}
return set;
} public static String toOrderString(int[] a) {
String str = new String("");
for (int i = 0; i < a.length; i++) {
str += (i + 1);
}
return str;
} /* 将排列组合好的各组下标序列值在数组中取相应的元素值 */
public static Set<String> getResult(Set<String> set, int[] a) {
Set<String> tempSet = new HashSet<String>();
String tempStr = new String("");
for (String str : set) {
for (int i = 0; i < str.length(); i++) {
tempStr += a[Integer.parseInt(str.substring(i, i + 1)) - 1];
}
tempSet.add(tempStr);
tempStr = "";
}
return tempSet;
} public static String toString(int[] a) {
String str = new String("");
for (int i = 0; i < a.length; i++) {
str += a[i];
}
return str;
}}输出结果:
There are 360 ways to rank the array.
312254
321524
254312
325412
435221
212543
125234
531242
124253
……
……
import java.util.*;
public class OYL {
public static String[] test(String str){
if(str.length()==1){
String[] temp=new String[1];
temp[0]=str;
return temp;
}
if(str.length()==2){
String[] temp=new String[2];
temp[0]=str;
temp[1]=str.substring(1, 2)+str.substring(0, 1);
return temp;
}
Set<String> result=new HashSet();
for(int i=0;i<str.length();i++){
String[] temp=test(get(str,i));
for(int j=0;j<temp.length;j++){
result.add(str.substring(i,i+1)+temp[j]);
}
}
String[] answer=new String[result.size()];
Iterator<String> it=result.iterator();
int h=0;
while(it.hasNext()){
answer[h]=it.next();
h++;
}
return answer;
}
public static String get(String str,int i){
if(i==0)
return str.substring(1,str.length());
if(i==str.length()-1)
return str.substring(0,str.length()-1);
return str.substring(0, i)+str.substring(i+1,str.length());
}
public static void main(String[] args){
String str=new String("122345");
String[] result=test(str);
for(int i=0;i<result.length;i++){
System.out.println(result[i]);
}
}
}this is mine!