3.9美团笔试第4题【java】前缀和滑动窗口加二分优化


import java.io.*;

public class Main {
    public static void main(String[] args) throws Exception {
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
        st.nextToken();
        int n= (int) st.nval;
        st.nextToken();
        int k= (int) st.nval;
        int[] a=new int[n+1];
        long[] a2=new long[n+1];
        long[] a5=new long[n+1];
        for (int i = 1; i < n + 1; i++) {
            st.nextToken();
            a[i]= (int) st.nval;
            a2[i]=a2[i-1]+cal(a[i],5);
            a5[i]=a5[i-1]+cal(a[i],2);
        }
        long tot2=a2[n],tot5=a5[n];
        long res=0L;
        for(int l=0;l<n;l++){ //删除区间必须得存在
            long zuo2 =tot2-k+a2[l];
            long zuo5 =tot5-k+a5[l];
            int findzuo2=findrm(zuo2,a2);
            int findzuo5=findrm(zuo5,a5);
            res+=Math.max(Math.min(findzuo2,findzuo5)-l,0);
        }
        System.out.println(res);
    }

    private static long cal(int shu, int yinzi) {
        long cnt=0;
        while(shu!=0&&shu%yinzi==0){
            cnt++;
            shu/=yinzi;
        }
        return cnt;
    }
    private static int findrm(long key, long[] arr) {
        int l=0,r=arr.length-1;
        while(l<=r){
            int mid=l+r>>>1;
            if(arr[mid]<=key)l=mid+1;
            else r=mid-1;
        }
        return r;
    }
}

全部评论
佬,看看得物春招吧
1 回复
分享
发布于 03-14 12:01 陕西

相关推荐

考试时间:3月9日&nbsp;10:00-12:00&nbsp;是美团的第一场笔试,也是我的暑期实习的第一场笔试题型:5道编程题,一道20分前三题属于打卡题目,大部分都可以AC,但是第四题比较卡人,滑动窗口的设计也不是那么直接,卡了我1个小时;第五题难度比较大,我用普通的广度优先搜索超时了,只通过了10%,算下来能拿82分吧?做完告诉我可以做第二次,不知道要不要做第二次这里只记录第四题与第五题4.&nbsp;小美拿到了一个大小为n的数组,她希望删除一个区间后,使得剩余所有元素的乘积末尾至少有k个&nbsp;0。小美想知道,一共有多少种不同的删除方案?输入:&nbsp;&nbsp;&nbsp;&nbsp;5&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;5&nbsp;3&nbsp;4&nbsp;20输出:&nbsp;&nbsp;&nbsp;&nbsp;4说明:&nbsp;&nbsp;&nbsp;&nbsp;一,删除[3]。&nbsp;&nbsp;&nbsp;&nbsp;二,删除[4]。&nbsp;&nbsp;&nbsp;&nbsp;三,删除[3,4]。&nbsp;&nbsp;&nbsp;&nbsp;四,删除[2]。这道题我理解下来理解了很久,才看懂区间的意思是指连续子数组,可以删多少种连续子数组,我一开始用总乘积,和子数组乘积的方法进行滑动窗口,来看商是不是10^k的倍数,结果测试通过了,告诉我除数过大,无奈之下把所有数字都分解成5和2的倍数,计算5的个数和2的个数,结合滑动窗口得出答案5.&nbsp;小美认为,在人际交往中,但是随着时间的流逝,朋友的关系也是会慢慢变淡的,最终朋友关系就淡忘了。现在初始有一些朋友关系,存在一些事件会导致两个人淡忘了他们的朋友关系。小美想知道某一时刻中,某两人是否可以通过朋友介绍互相认识?事件共有&nbsp;2&nbsp;种:1&nbsp;u&nbsp;v:代表编号&nbsp;u&nbsp;的人和编号&nbsp;v&nbsp;的人淡忘了他们的朋友关系。2&nbsp;u&nbsp;v:代表小美查询编号&nbsp;u&nbsp;的人和编号&nbsp;v&nbsp;的人是否能通过朋友介绍互相认识。注:介绍可以有多层,比如&nbsp;2&nbsp;号把&nbsp;1&nbsp;号介绍给&nbsp;3&nbsp;号,然后&nbsp;3&nbsp;号再把&nbsp;1&nbsp;号介绍给&nbsp;4&nbsp;号,这样&nbsp;1&nbsp;号和&nbsp;4&nbsp;号就认识了。输入描述:第一行输入三个正整数n,m,q,代表总人数,初始的朋友关系数量,发生的事件数量。接下来的m行,每行输入两个正整数u,v,代表初始编号u的人和编号v的人是朋友关系。接下来的q行,每行输入三个正整数op,u,v,含义如题目描述所述。输出描述对于每次&nbsp;2&nbsp;号操作,输出一行字符串代表查询的答案。如果编号&nbsp;u&nbsp;的人和编号&nbsp;v&nbsp;的人能通过朋友介绍互相认识,则输出&quot;Yes&quot;。否则输出&quot;No&quot;。这道题会的大哥可以评论区留言
投递美团等公司10个岗位
点赞 评论 收藏
转发
1.自我介绍2.抓着项目的一些问面试官喜欢问从顶层的实验设计的一些东西我的实验为什么要选用&nbsp;cos&nbsp;距离或者&nbsp;mse?能不能用&nbsp;KL散度?是不能用还是不好用?KL&nbsp;散度和交叉熵的区别和联系是什么?(都是我没考虑过的问题&nbsp;有点汗流浃背)既然你用到了那么多微调方式,&nbsp;那你有什么实验过程中探究了&nbsp;lora&nbsp;的比如&nbsp;秩之类的参数的影响吗?prompt&nbsp;tuning&nbsp;&nbsp;ptuning&nbsp;v2&nbsp;有啥区别?(说完他觉得我说的太八股太宏观了,又讲了一堆原理)为什么&nbsp;p&nbsp;v&nbsp;2&nbsp;比&nbsp;prefix&nbsp;tuning&nbsp;要减去那个&nbsp;lstm&nbsp;和&nbsp;linear?&nbsp;我说论文里说适配&nbsp;NLG&nbsp;任务,好像记错了。有没有接触过强化学习?为什么你们只考虑微调,是因为啥原因?你是用几张卡跑实验?多大参数的模型?跑的时候内存占用量多大?有没有试过全量微调?&nbsp;那你想一下,假如我用&nbsp;deepspeed&nbsp;的几种版本,&nbsp;全量微调7B&nbsp;模型,内存占用多大?最后大概的意思就是说他比较看重实验最初的一些设计能力,&nbsp;不能蹬&nbsp;OOM&nbsp;再来解决。让我之后要多理解一下&nbsp;deepspeed。说社招看的多这些理解能力。反正基本上就是项目围绕讲。&nbsp;后面说我项目做的,工程应该能力不错。&nbsp;代码题也是那种很简单的处理数据。
点赞 评论 收藏
转发
点赞 6 评论
分享
牛客网
牛客企业服务