牛客刷题笔记-途虎养车2021秋招Java笔试

1、对于给定的非负整数r和n(r≤n),请编写程序计算组合数C(r,n) = n! / r! / (n-r)!。

(本题目用于测试的所有用例,都保证结果小于2^31-1)

import java.util.*;
public class Solution {
    
    
    public static int combination (int r, int n) {
    
    
        long p = 1;
        for(int i=n;i>n-r;i--){
    
    
            p *= n;
        }
        for(int i=1;i<=r;i++){
    
    
            p /= i;
        }
        return (int)p;
    }
}

以上是我的方法,但是超时了。学习一下其他解法。

import java.util.*;
public class Solution {
    
    
    public int combination (int r, int n) {
    
    
        if(r==0){
    
    
            return 1;
        }
        if(r==1)
            return n;
        if(r>n/2){
    
    
            return combination(n-r,n);
        }
        if(r>1){
    
    
            return combination(r-1,n-1)+combination(r,n-1);
        }
        return -1;
    }
}

组 合 数 公 式 : C n m = C n − 1 m + C n − 1 m − 1 {组合数公式:} C^m_n=C^m_{n-1}+C^{m-1}_{n-1} Cnm=Cn1m+Cn1m1

2、现给出两个有序整型数组,其中array1按升序(从小到大)排序,array2按降序排序,请你将 array1和array2 合并到一个新的数组中,并保持新中的元素按升序排序。

说明:给出 array1 和 array2 及其元素数量n 和 m ,返回合并后的新数组。

import java.util.*;
public class Solution {
    
    
    private static void QuickSort(int[] num, int left, int right) {
    
    
        if(left>=right) {
    
    
            return;
        }
        int key=num[left];
        int i=left;
        int j=right;
        while(i<j){
    
    
            while(num[j]>=key && i<j){
    
    
                j--;
            }
            while(num[i]<=key && i<j){
    
    
                i++;
            }
            if(i<j){
    
    
                int temp=num[i];
                num[i]=num[j];
                num[j]=temp;
            }
        }
        num[left]=num[i];
        num[i]=key;
        QuickSort(num,left,i-1);
        QuickSort(num,i+1,right);
    }
    public static int[] arrayMerge (int[] array1, int n, int[] array2, int m) {
    
    
        int[] array = new int[m+n];
        for(int i=0;i<n;i++){
    
    
            array[i]=array1[i];
        }
        for(int i=0;i<m;i++){
    
    
            array[i+n]=array2[i];
        }
        QuickSort(array,0,n+m-1);
        return array;
    }
}

第二题继续超时,看了下没有通过的代码示例,但是也可以学习一下其他方法。

public int[] arrayMerge (int[] array1, int n, int[] array2, int m) {
    
    
        int[] res=new int[n+m];
        int i=0,j=m-1,k=0;    //双指针
        while(i<n&&j>=0){
    
    
            if(array1[i]<array2[j]) res[k++]=array1[i++];
            else if(array1[i]>array2[j]) res[k++]=array2[j--];
            else {
    
     res[k++]=array1[i++];res[k++]=array2[j--]; }
        }
        while (i<n) res[k++]=array1[i++];
        while (j>=0) res[k++]=array2[j--];
        return res;
    }

猜你喜欢

转载自blog.csdn.net/qq_41536271/article/details/114611323