拼多多5月6日 后端笔试题 第四题

因为是竞赛题所以大部分都是C++的,我用Java写了一遍。
【题意】
给出一个长度在 100 000 以内的正整数序列,大小不超过 1012 求一个连续子序列,使得在所有的连续子序列中,它们的gcd值乘以它们的长度最大
输入
6
5 8 6 2 6 8
输出
10
第一轮:
从最后的8开始
使用栈1 栈2
8 :5 入栈1,8入栈2;
6 8 :求6和8的公约数 为2 ,2<8;4 入栈1 2入栈2;
2 6 8 :求2 和 栈顶 2 的公约数 ,2 == 2 ;4出栈1 3入栈1(此处替换了栈1的栈顶);
6 2 6 8:6和栈顶2的公约数 , 2 == 2; 3出栈1,2入栈1(替换);
8 6 2 6 8: 8和栈顶2的公约数,2==2; 2出栈1,1入栈1;
5 8 6 2 6 8 : 5和栈顶2的公约数 1!=2 ;0入栈1, 1入栈2;
两个栈同时出栈,得到当前长度*公约数,当前长度计算见代码。

import java.util.Scanner;
import java.util.Stack;

public class Pdd2020S4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int [] temp = new int[N];
        for(int i=0;i<N;i++){
            temp[i] = sc.nextInt();
        }
        //最终结果
        int res =0;
        //从最右端开始
        for(int i=N-1;i>=0;i--){
            Stack <Integer> stack1 = new Stack();
            Stack <Integer> stack2 = new Stack();
            //从最右端开始
            for(int j=i;j>=0;j--){
                if(stack1.isEmpty()){
                    stack1.push(j);
                    stack2.push(temp[j]);
                }else{
                    int preG = stack2.peek();
                    //借用上次计算的公约数,计算右移一位的公约数
                    int curG = gcd(temp[j],preG%temp[j]);
                    //若公约数相等便更新起始点
                    if(preG==curG){
                        stack1.pop();
                        stack1.push(j);
                        //若公约数小于原来 则新增
                    }else if(curG<preG){
                        stack1.push(j);
                        stack2.push(curG);
                    }

                }
            }
            //出栈计算结果
            while (!stack1.isEmpty()){
                res = Math.max(res,(i-stack1.pop()+1)*stack2.pop());
            }
        }
        System.out.println(res);
    }

    //调用之前进行 b%a;

    //要求a>b;在之前做b%a
    public  static  int gcd(int a,int b){
        return b==0?a:gcd(b,a%b);
    }
}

虽然是暴力解题,但是在计算公约数的时候还是取了巧,以及中间过程的计算。有不对的地方请多指教,包括代码规范。

全部评论

相关推荐

03-20 12:22
门头沟学院 Java
牛客998737654号:没有hc了吧,但是我接到到后端的面试邀请
投递美团等公司9个岗位
点赞 评论 收藏
分享
吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务