---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
题目:任意数字序列“123456”之类,输出它们所有的排列组合
分析:先把这个序列放在一个有序集合里,然后将这个集合里的元素一个个取出来放到另一个集合中,这样就知道有几种取法就可以得到几种排列组合的可能。
代码伺候:
package Day2;
import java.util.ArrayList;
import java.util.List;
public class TestStringAssemble {
public static int sum = 0;
public static void main(String[] args) {
String str = "132";
List<Character> candidate = new ArrayList<Character>();
for (int i=0; i<str.length(); i++) {
candidate.add(str.charAt(i));
}
List<Character> completed = new ArrayList<Character>();
long start = System.currentTimeMillis();
arrangecdl(candidate, completed);
long end = System.currentTimeMillis();
// 消耗的时间
System.out.println(end-start);
}
public static void arrangecdl(List<Character> candidate, List<Character> completed) {
// 如果已经全部选完了就打印
if (candidate.size() == 0) {
System.out.print(completed);
// 记录一共有几种可能
sum++;
System.out.println(sum);
return;
}
for (int i=0; i<candidate.size(); i++) {
// 保护现场
List<Character> candidate1 = new ArrayList<Character>();
candidate1.addAll(candidate);
List<Character> completed1 = new ArrayList<Character>();
completed1.addAll(completed);
// 将带排的候选数娶一个到已排的数中
completed1.add(candidate1.remove(i));
// 形成新的候选数和已排数集合,继续递归
arrangecdl(candidate1, completed1);
}
}
}
参考了一下别人的代码,发现大体思路差不多,但细节上可以有所改进。
恩,其实是语法上的改进
改进部分:
List<Character> candidate1 = new ArrayList<Character>(candidate);
List<Character> completed1 = new ArrayList<Character>(completed1);
如果用字符串来完成的话:
package Day2;
public class TestStringAssemble2 {
/**
* @param args
*/
public static void main(String[] args) {
String str = "1234567890";
StringBuilder sb = new StringBuilder(str);
StringBuilder completed = new StringBuilder();
long start = System.currentTimeMillis();
arrange(sb, completed);
long end = System.currentTimeMillis();
System.out.println(end-start);
}
public static void arrange(StringBuilder candidate, StringBuilder completed) {
if (candidate.length() == 0) {
System.out.println(completed);
}
for (int i=0; i<candidate.length(); i++) {
StringBuilder candidate1 = new StringBuilder(candidate);
StringBuilder completed1 = new StringBuilder(completed);
completed1.append(candidate1.charAt(i));
candidate1.deleteCharAt(i);
arrange(candidate1, completed1);
}
}
}
效率更高
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net