问题:输出1,2,3三个数的全排列
import java.util.ArrayList;
public class Main {
static ArrayList l=new ArrayList();
//用于检查是否出现过
static boolean []b=new boolean[3];
//回溯
static void f(int []a,int end){//
//一个终结条件,也就是满足条件的时候
if (end==a.length) {
System.out.println(l);
}else {
//循环的数量
for (int i = 0; i < a.length; i++) {
//判断是否用过
if (!b[i]) {
//记录
l.add(a[i]);
//标记用过
b[i]=true;
//进入下一步
f(a,end+1);
//恢复:保存结果之前的状态{回溯一步}
l.remove(l.size()-1);
b[i]=false;
}
}
}
}
public static void main(String[] args){
//循环的数字
int[] a={1,2,3};
f(a,0);
}
}
以上全排列在输出时候不会按照规范输出,如果要规范输出就得再加一个循环,同时也是增加大量时间空间,便想到使用StringBuffer
import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
static int n = sc.nextInt();
static StringBuffer sb = new StringBuffer();
static boolean[] p = new boolean[n+1];
public static void main(String[] args) {
f(n);
}
private static void f(int k) {
if (k==0) {
System.out.println(sb);
return;
}else{
for (int i = 1; i <= n; i++) {
if (!p[i]) {
p[i]=true;
sb.append(i+" ");
f(k-1);
sb.delete(sb.length()-2, sb.length());
p[i]=false;
}
}
}
}
}
使用StringBuffer的加减操作代替循环