【蓝桥Java每日一练】——7

🐤1.至少是其他数字两倍的最大数

=================

给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。

请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。

题目链接:至少是其他数字两倍的最大数

题目分析:题目的要求非常简单,找出一个数组的最大值的下标即可,只不过这个最大值有一个限制条件,它**至少是数组中每个其他数字的两倍。**大家起码都是大学生了,这意思肯定能看懂吧,无非就是要求最大值最少都都得是次大值的两倍,所以我们遍历一遍数组,利用两个变量maxIndex1和maxIndex2去找到数组中的最大值下标和次大值下标就好啦。

遍历过程:

当我们循环判断nums[i]时,会有三种情况:

1.此时nums[i]>nums[maxIndex1],nums[maxIndex1]也就是最大值,那么说明找到了个更大的,我们把maxIndex1更新成i

2.此时nums[maxIndex1]>nums[i]>nums[maxIndex2],找到了个次大值,我们把maxIndex2更新为i

3.此时nums[i]<nums[maxIndex2],小于次大值,这个数对我们无意义,不处理

最后我们去判断nums[maxIndex1]>=2*nums[maxIndex2],如果满足我们就输出maxIndex1,否则输出-1

🐣1.易错情况1


上述的逻辑其实是有地方有错误的,不知道大家能否发现,因为根据上述的代码我们会写出如下的代码:

错误版本代码1:

class Solution {

public int dominantIndex(int[] nums) {

if(nums.length==1) return 0;

//1维护的是最大值下标,2维护的是次大值下标

int maxIndex1=0;

int maxIndex2=0;

for(int i=1;i<nums.length;i++){

if(nums[i]>nums[maxIndex1]){

maxIndex2=maxIndex1;

}else if(nums[i]>nums[maxIndex2]){

maxIndex2=i;

}

}

if(nums[maxIndex1]>=2*nums[maxIndex2]){

return maxIndex1;

}else{

return -1;

}

}

}

这样一写就发现连题目给的第二个用例就过不了:        为什么呢?明明4不是3的两倍,为什么还输出下标3呢?其实如果我们去眼睛debug一下,很容易就会发现一个问题——在情况1中,我们把maxIndex1更新为i,但是没有把maxIndex2更新为****maxIndex1。虽然maxIndex1它遇到了比他更大的,但它应该为次大,所以需要把maxIndex1赋值给maxIndex2。

🐣2.易错情况2

=================

如果照上面改正一定就没问题了吧,没错本来我也是这么想的,完善的代码如下:

错误版本2

class Solution {

public int dominantIndex(int[] nums) {

if(nums.length==1) return 0;

//1维护的是最大值下标,2维护的是次大值下标

int maxIndex1=0;

int maxIndex2=0;

for(int i=1;i<nums.length;i++){

if(nums[i]>nums[maxIndex1]){

maxIndex2=maxIndex1;

maxIndex1=i;

}else if(nums[i]>nums[maxIndex2]){

maxIndex2=i;

}

}

if(nums[maxIndex1]>=2*nums[maxIndex2]){

return maxIndex1;

}else{

return -1;

}

}

}

提交以后获得血红的提示:       其实当我一看到这个用例时,我就知道问题出在了哪!我的maxIndex1和maxIndex2起始下标都是0,可是如果num[0]是一个数组的最大元素,那么maxIndex2就不会更新,导致答案出错。我觉得这个还是比较难想到的,究其原因还是因为我的maxIndex1和maxIndex2不合理。但是我们也加一行代码给它强制改正,当nums[maxIndex2]遇到nums[1]比自己小的时候,把maxIndex2更新为1。

🐣3.正确答案版本


结合以上的经验,我们终于写出来AC的代码了:

class Solution {

public int dominantIndex(int[] nums) {

if(nums.length==1) return 0;

//1维护的是最大值下标,2维护的是次大值下标

int maxIndex1=0;

int maxIndex2=0;

for(int i=1;i<nums.length;i++){

if(i==1&&nums[i]<nums[maxIndex2]){

maxIndex2=i;

}

if(nums[i]>nums[maxIndex1]){

maxIndex2=maxIndex1;

maxIndex1=i;

}else if(nums[i]>nums[maxIndex2]){

maxIndex2=i;

}

}

if(nums[maxIndex1]>=2*nums[maxIndex2]){

return maxIndex1;

}else{

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

毕竟工作也这么久了 ,除了途虎一轮,也七七八八面试了不少大厂,像阿里、饿了么、美团、滴滴这些面试过程就不一一写在这篇文章上了。我会整理一份详细的面试过程及大家想知道的一些问题细节

美团面试经验

美团面试
字节面试经验
字节面试
菜鸟面试经验
菜鸟面试
蚂蚁金服面试经验
蚂蚁金服
唯品会面试经验
唯品会

因篇幅有限,图文无法详细发出
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
xnJ-1713424774816)]
蚂蚁金服面试经验
[外链图片转存中…(img-yQtJ2zBV-1713424774817)]
唯品会面试经验
[外链图片转存中…(img-Ofu3s2uN-1713424774817)]

因篇幅有限,图文无法详细发出
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值