滴滴4.10后端笔试算法第二题(java)

题目大致是这样的:
第一行输入N,X(N为数组长度,X为等差数列的公差,X大于0);第二行输入为N个正整数,代表数组元素。每次可以变化数组中的一个元素为任意正整数,问将数组变成一个以X为公差的等差数列最小的步数(数列为正整数数列)。
本地用了几个测试用例均通过,但是提交上去AC只有0.18,提示答案错误(没有超时超空间)请大佬指正:
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int x=sc.nextInt();
int[] trees=new int[n];
for(int i=0;i<n;i++){
trees[i]=sc.nextInt();
}
sc.close();
int length=0;  //连续等差子列长度
int max=0;     //记录最长的长度
for(int i=1;i<n;i++){
if(trees[i]-trees[i-1]==x&&trees[i-1]>=1+(i-1)*x){       //寻找连续等差子数列,且该子序列起始点的值需满足让变化后的tree[0]>=1
length++;
max= max>length?max:length;                           //更新max
}else{                                 //不满足条件则length归零
length=0;
}
}
System.out.println(n-max-1);
}
}

#滴滴##笔试题目#
全部评论
用的是贪心算法,用两个数组分别存储准备时间与执行时间(prepare和commit) 同时用一个最小堆维护prepare的最小值(堆内存的是索引PriorityQueue<Integer> pq=new PriorityQueue<>((x,y)->prepare[x]-[prepare[y])),每次弹出准备时间最小的任务索引index(运行这个)如果prepare[index]>0,则将prepare[i]全部减去prepare[index],并将返回值time增加这个prepare[index],同样的,运行执行任务时也把prepare[i]全部减去commit[index]。直到堆为空后time加上所有的执行时间commit[i]即为结果
点赞 回复 分享
发布于 2021-04-11 10:15
第一题怎么做,可以发下第一题的代码吗
点赞 回复 分享
发布于 2021-04-10 21:55
同0.18
点赞 回复 分享
发布于 2021-04-10 21:41

相关推荐

2025-12-28 20:47
已编辑
北京工商大学 Java
程序员牛肉:我靠你这个实习经历其实最需要担心的点是你做的太多了,可能会被面试官怀疑是你伪造的。 交易状态机是你做的,支付多渠道是你做的,对账是你做的,结算还是你做的,重复支付也是你做的,整个服务的异常处理也是你做的。 其实你这个反而问题很大的,你想想站在面试官的角度,他是真的会相信你的能力很强,还是相信这份实习你伪造了大部分?我相信你真的做了这么多,但是删一些,废话删一删。你这个做的太多了反而真实性不可信。 后面再补一个项目,在github上找一个高star的项目学一学然后写到自己简历上。我觉得你能力肯定没问题。28届能做到这个份上很厉害,但是在求职市场中,你不是在跟28届的同学比,把你这个简历放到27届其实也就一般水平。 所以后续要想一想看看能不能给自己简历上搞点亮点,比如开源贡献呢?比如博客呢?
实习要如何选择和准备?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务