2020校招8.17日腾讯技术笔试题2

题目:
作为程序员的小Q,他的数列和其他人的不太一样,他有2^n个数,老板问了小Q一共m次,每次给出一个整数qi(1<=i<=m),要求小Q把这些数每2的qi分为一组,然后每组进行翻转,小Q想知道每次操作后整个序列中的逆序对个数是多少?

输入描述:
第一行一个数n
第二行2^n个数,表示初始序列
第三行一个数m
第四行m个数表示qi

输出:
m行每行一个数表示答案

方法:强行翻转+归并排序求逆序对
思路:这种数组中求逆序对的题都可以转化为归并排序来求,时间复杂度是n*logn,比冒泡要好,注意因为翻转和求逆序对都是在对一个数组进行操作,但之后的操作会使用翻转后的数组,所以需要用一个数组记下翻转后的数组,传回开头的方法里

代码:
static int count;//静态全局变量,表示逆序对的个数
    public static void niXuDui(int[] array,int[] num){
        for (int i = 0; i =high) return;
        int mid =low+(high-low)/2;
        merge(array,low,mid);
        merge(array,mid+1,high);
        mergeSort(array,low,mid,high);
    }
    public static void mergeSort(int[] array,int low,int mid,int high){
        int[] temp = new int[high-low+1];
        int i=low,j=mid+1,k=0;
        while(i<=mid&&j<=high){
            if(array[i]<=array[j]){
                temp[k++]=array[i++];
            }else{
                count+=mid-i+1;
                count%=1000000007;
                temp[k++]=array[j++];
            }
        }
        while(i<=mid){
            temp[k++]=array[i++];
        }
        while(j<=high){
            temp[k++]=array[j++];
        }
        for (int l = 0; l

你可能感兴趣的:(校招笔试题)