虾皮笔试9.3

117 阅读2分钟

离谱的虾皮,我8.18做完之后,北京岗挂了,深圳岗捞了之后还要再做一次,不过这次提比上次的简单,动规贪心图都没有,又一个题的用例只能过90%,

1.给一个数组,输出最大的k个数之和。

直接sort排序,然后加就行

public class one1 {
    public static void main(String[] args) {
        int[] nums={4,1,7,3,9,2};
        int k=3;
        System.out.println(maxK(nums,k));
    }
    public static int maxK(int[] nums, int k) {
        // write code here
        Arrays.sort(nums);
        int res=0;
        int n=nums.length-1;
        while(k>0){
            res+=nums[n];
            n--;
            k--;
        }
        return res;
    }
}

2.一个数组,由01构成,0表示空,1表示种了花,现在给你一个数组,给你一个k,问能不能把k个花种下

public class two1 {
    /**
     * Note: 类名、方法名、参数名已经指定,请勿修改
     *
     *
     *
     * @param flowerbed int整型 一维数组
     * @param n int整型
     * @return bool布尔型
     */
    public static void main(String[] args) {
        int[] nums={1,0,0,0,1};
        int n=3;
        System.out.println(plantFlowers(nums,n));
    }
    public static boolean plantFlowers(int[] flowerbed, int n) {
        // write code here
        int length=flowerbed.length;
        int count=0;
        for(int i=0;i<length;i++){
            if(flowerbed[i]==0&&(i==0||flowerbed[i-1]==0)
                    &&(i==length-1||flowerbed[i+1]==0)){
                count++;
                flowerbed[i]=1;
            }
        }
        return count>=n;
    }
}

3.一个字符串,给一个k,求连续k个字符串出现次数最多的那一个子串

直接用hash表,字符串拼接,子串作为key,个数为value

public class three {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int[] arr1={1,5,13,15};
        int[] arr2={10,11,17,20};
        int x=20;
        int[] res=findClosetPair(arr1,arr2,x);
        System.out.println(res[0]+res[1]);
    }
    public static int[] findClosetPair(int[] arr1, int[] arr2, int x) {
        // write code here
        int[] arr=new int[arr2.length];
        for(int i=0;i<arr.length;i++){
            arr[i]=i;
        }
        Integer[] sort2=new Integer[arr2.length];
        for(int i=0;i< arr2.length;i++){
            sort2[i]=arr2[i];
        }
        Arrays.sort(sort2);
        int c=Integer.MAX_VALUE;
        int[] res=new int[2];
        for (int i=0;i< arr1.length;i++){
            int index=find(sort2,x-arr1[i]);
            int cur=Math.abs(x-(arr1[i]+sort2[index]));
            if(cur<c){
                c=cur;
                res[0]=i;
                res[1]=arr[index];
            }
        }
        return res;
    }
    public static int find(Integer[] arr,int target){
        int l=0,r=arr.length-1;
        while(l<r){
            int mid=l+(r-l)/2;
            if(arr[mid]<target){
                l=mid+1;
            }else {
                r=mid;
            }
        }
        if (l==0) return l;
        if(Math.abs(arr[l]-target)<Math.abs(arr[l-1]-target)) return l;
        else return l-1;
    }
}