网易面试题之 牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因, * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,

package wangyi;

/**
 * Created by Administrator on 2016/12/7.
 * 牛牛的作业薄上有一个长度为 n 的排列 A,这个排列包含了从1到n的n个数,但是因为一些原因,
 * 其中有一些位置(不超过 10 个)看不清了,但是牛牛记得这个数列顺序对的数量是 k,
 * 顺序对是指满足 i < j 且 A[i] < A[j] 的对数,请帮助牛牛计算出,符合这个要求的合法排列的数目。
 */

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Test5{

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int RES = 0;
            int n = sc.nextInt();
            int k = sc.nextInt();
            int[] A = new int[n];
            boolean[] flag = new boolean[n+1];
            //flag标记哪些数字已经存在
            for(int i=0;i list = new ArrayList();
            for(int i=1;i<=n;i++){
                if(flag[i] == false)
                    list.add(i);
            }

            //perm用来存模糊数字的全排列
            List> perm = new ArrayList>();

            //计算perm
            calperm(perm, list, 0);

            //统计已有的排列的顺序对
            int cv = 0;
            for(int i=0;i tmp : perm){
                int val = cv;
                int[] tmpA = Arrays.copyOf(A, n);
                val += calvalue(tmp, tmpA);
                if(val == k)
                    RES++;
            }

            System.out.println(RES);
        }
    }

    //计算排列的顺序对
    public static int calvalue(List list, int[] A){
        int val = 0;
        int j = 0;
        for(int i=0;iA[i])
                        val++;
                }
            }
        }
        return val;
    }

    //计算全排列
    public static void calperm(List> perm , ArrayList list, int n){
        if(n == list.size()){
            perm.add(new ArrayList(list));
        }else{
            for(int i=n;i

你可能感兴趣的:(java数据结构,java基础)