2017百度软件开发实习生编程题第三题,全排列问题
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class baidu3 {
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
while (scanner.hasNext()) {
int n=scanner.nextInt();
int k=scanner.nextInt();
int[] t=new int[n];
for (int i = 0; i < t.length; i++) {
t[i]=i+1;
}
ArrayList<List<Integer>> num=permute(t);
int less = k;//小于号
int large = n - k - 1;//大于号
int ans = 0;
//计算大小符号的问题,这边采用逐步减一并判断最后的符号数是否都为0进行计数。
for (int i = 0; i < num.size(); ++i) {
List<Integer> list = num.get(i);
for (int j = 1; j < list.size(); ++j) {
if (list.get(j) < list.get(j-1)) {
large -= 1;
} else {
less -= 1;
}
}
if (less == 0 && large == 0) {
ans++;
}
//每次遍历完一个list后要将符号数量恢复到初始
less=k;
large = n - k - 1;
}
System.out.println(ans);
}
}
//下面的作用就是全排序
public static ArrayList<List<Integer>>
permute(int[] nums) {
ArrayList<List<Integer>> rst = new
ArrayList<List<Integer>>();
if (nums == null) {
return rst;
}
if (nums.length == 0) {
rst.add(new ArrayList<Integer>());
return rst;
}
ArrayList<Integer> list = new
ArrayList<Integer>();
helper(rst, list, nums);
return rst;
}
public static void
helper(ArrayList<List<Integer>> rst,
ArrayList<Integer> list, int[] nums){
if(list.size() == nums.length) {
rst.add(new ArrayList<Integer>(list));
return;
}
for(int i = 0; i < nums.length; i++){
if(list.contains(nums[i])){
continue;
}
list.add(nums[i]);
helper(rst, list, nums);
list.remove(list.size() - 1);
}
}
}