2020/4/3 美团笔试(再次惨败)

昨天携程惨败,今天美团惨败.....刷题太少根本不够应对笔试的,美团今年的笔试是5道编程,目测两道leetcode简单 ,两道中等,一道困难。本文纯属记录一下自己的菜鸡笔试历程,如果对某个题目有好的解法,请一定评论私信指教一下!感谢!

两道简单的感觉自己都做出来了,但是一个只能通过部分测试样例,一个超时了,剩下的题没有做.....感觉这两个企业笔试题都喜欢考动态规划,这快接下来得好好看看了,之前没怎么做过这种题。

关于第一题,图片太大,上传不上来,我就只写文字了。

给出一个序列包含n个正整数的序列A,你可以从中删除若干个数,使得剩下的数字中的最大值和最小值之差不超过x,
请问最少删除多少个数字。

输入第一行仅包含两个正整数n和x,表示给出的序列的长度和给定的正整数。(1<=n<=1000,1<=x<=10000)

接下来一行有n个正整数,即这个序列,中间用空格隔开。(1<=a_i<=10000)

输出仅包含一个正整数,表示最少删除的数字的数量。

输入
 5 2
 2 1 3 2 5
输出
 1

这道题可能是我想错了,我首先将数组进行排序,然后用了两个指针left=0和right=length-1从数组的两端向里面移动,如果当前的arr[left+1]-arr[left]>arr[right]-arr[right-1]那么说明移动left比移动right更优,直到arr[right]-arr[left]<=x结束循环。

这样应该是错了,看到牛客有评论是暴力寻找,i从0到arr.length-1每个元素找到能满足arr[j]-arr[i]<=x的最大j值,O(n2)的时间复杂度,待会我进行code尝试一下。

上面这道题可以去了解一下尺取法。

https://www.nowcoder.com/discuss/180336?type=101

https://zhuanlan.zhihu.com/p/61564531

从上面这篇知乎得知,这个题应该和leetcode209是同种解法

第二题(图从大佬那里偷来的)

2020/4/3 美团笔试(再次惨败)_第1张图片

这道题我的想法是这样的,

输入数组为arr,烙印数steps=0,

先对输入的数组中所有的数进行求和得到sum,steps =(m/sum)*arr.length,m=m%sum

用LinkedList记录从1,2...arr.length-1个数,while(m>0)条件下使用迭代器遍历list,当m>=arr[i]时,m-=arr[i],steps++,当m

public static long StepCountFunc(int[] arr,long n){
//        int canLeavePower =0;
        long steps=0;
        long sum =0;
        for(int i=0;i=sum){
            steps=(n/sum)*arr.length;
            n=n%sum;
        }
        LinkedList list =new LinkedList<>();
        for(int k=0;k iterator;
        while (n>0){
            iterator= list.iterator();
            while (iterator.hasNext()){
                int index = iterator.next();
                if(n>=arr[index]){
                    n=n-arr[index];
                    steps++;
                }else {
                    iterator.remove();
                }
            }
            if(list.size()==0) return steps;
        }
        return steps;
    }

检查代码我好像知道为什么只能AC27%了,主函数里我是这么调用的.....21是测试样例的,我给写死了,妈个鸡哦....被自己蠢死。

long steps = StepCountFunc(nums,21);

System.out.println(steps);

刚看了牛客某acm大佬的思路,原博如下

https://jkchen.blog.csdn.net/article/details/105279440

大佬的代码我完全没看懂,C比Java可读性差太多了/(ㄒoㄒ)/~~,关键是这句,不能整圈(sum>m)的情况,显然某个前缀的sum已经>m了,所以我们二分这个前缀(动态前缀和使用树状数组维护),将第一个大于m的前缀的那个位置删掉。

我大致理解思想了,可我写不出来.....

第三题是动态规划,再引用一下这位大佬的博客

https://blog.csdn.net/jk_chen_acmer/article/details/105279577

概率dp https://blog.csdn.net/wuxiaowu547/article/details/81835800

后面的再总结吧,现在的我也不会做....这两天笔试真的受打击了,得好好刷题才行了,加油吧。

你可能感兴趣的:(2020/4/3 美团笔试(再次惨败))