leetcode刷题记录-day8

leetcode刷题记录-day8

148

在这里插入图片描述
1.这道题的题解全部都是用归并排序完成的,而我使用的则是快速排序,也还不错,记得使用一个fakeHead(吹爆这个idea);
2.这是微软面试最喜欢问的问题,建议复习时再多看一遍,pass

150

在这里插入图片描述
1.这道题微软没有考察过,不过其他外企考察的挺多的。
2.做法上,逆波兰表达式的处理方法是遇到数字就push进去,然后遇到操作符就pop两个出来,然后执行运算(这里一定一定要切记,是顶上第二个数,操作,顶上第一个数,千万别搞混了!!!)
3.中序表达式转逆波兰表达式的方法也很简单,规则如下:
首先,遇到数字,直接push进入ans;
其次,遇到左括号,直接push进stack
接着,遇到操作符,那就进入while循环(
如果stack为空,或者顶上是左括号,或者顶上优先级没自己高,那就直接push stack;break
不然的话,就把stack的pop一个,pop到ans里,接着判断;

最后,遇到右括号,就直接把stack里的东西给pop到ans里,直到遇到左括号,当然得把左括号给pop了,直接扔掉。
4.一定一定要重点复习!重点了解中缀表达式转后缀表达式,以及后缀表达式的计算!pass

151

在这里插入图片描述
1.这是微软最喜欢考的问题,当然难度就很适中。
2.首先要把头部尾部以及字符串单词中间的超过一个空格给删除掉。做法很简单,就先while循环把头尾删除空格,然后遍历字符串,把单词中间的空格删除掉(判断一个方向是否相邻空格,是就删除)
3.然后进行安全检查,对于空字符串或者长度为1,直接返回;
4.将整个字符串翻转,然后搞事情吧,后面就简单了
5.建议复习时重点思考这个流程!pass

152

在这里插入图片描述
1.这道题是微软和字节跳动最喜欢的题目,也和我前段时间面试微软苏州的一个问题非常类似。建议复习的时候重点看一下!
2.之前想用那啥的dp来做,无非是details[i] = max(details[i-1], max(j, details[j, i]));但是很显然这样的时间复杂度是O(n2),肯定爆炸!
3.我要吹爆正确的做法:同样是dp,但是我维护的是details[i] = pair<int, int>(INT_MAX, INT_MIN),这么看您懂了么?如果第i个数是正数,那就将details[i-1]的最大和最小都分别更新一下;如果是0的话也是同样的道理;如果是负数,那么可能会倒过来,具体还是要取max或者min判断。如此一来,这一题就成了O(n)的复杂度了!!!
4.mark!!!!!!!!!!!!!!!!

153

在这里插入图片描述
1.这道题也是微软和字节跳动特别喜欢出的题目,复习的时候也要重点查看
2.思路其实很简单,首先咱们做一个corner case的处理,长度为1的直接返回该值;然后咱们再看看首尾数据是否是正常大小关系(这一步主要是怕他没有旋转数组,但是后面做完了题目发现不需要处理)
3.一切正常后,leftIndex=0,rightIndex=s.size()-1,然后退出条件是while(rightIndex > leftIndex),看到这里你应该发现了,我并没有使用二分法中常用的大于等于,这是因为,rightIndex在得知需要更新后,不能设置成midIndex-1,而是应该设置成midIndex,原因是我怕rightIndex直接一脚就冲过头了。
4.pass!

156

在这里插入图片描述
1.微软不怎么考这道题。
2.做法显然是dfs,但是我写的有点毛病。主要在于,dfs的时候,你想把自己的rightNode移动到leftNode->rightNode时,请顺手把自己的rightNode置为nullptr
3.建议自己稍微顺一遍,pass

159

在这里插入图片描述
1.微软出现的频次不是特别高,但是也要看。
2.首尾指针跑就完事儿了,不过要注意,当rightIndex跑到不能跑的时候,再回过头来更新leftIndex,这个逻辑是没问题的。
3.pass!

161

在这里插入图片描述
1.微软没咋考过这道题
2.难度很低,不过还是粗心错了一点逻辑,建议复习的时候再仔细想一遍

162

在这里插入图片描述
1.这是字节跳动非常喜欢的题目,一定要高度关注。
2.思路其实还是很简单的,因为它让我在O(logn)的时间复杂度内完成,所以咱们就用二分,当然是递归的二分。但是我的做法是错误的!我就是单纯的二分,但是我并没有实现logn的时间复杂度,因为我根本就没有判断取舍,是该向左还是该向右,我是直接就都跑了,这是不满足要求的一种做法!
3.官方题解的做法是:因为左侧边界和右侧边界都是负无穷,因此:只要midIndex比右侧大,那么最大值就一定能出现在midIndex左侧!反之则是右侧!卧槽!我吹爆好吧,这种我真的还没能思考出来,这个方法实在是巧妙!
4.请务必在复习的时候重点再思考一遍!!!

163

在这里插入图片描述
1.个人感觉挺不错的一道题,facebook考了很多次。
2.思路的话应该是没啥问题的,其实也没啥好说的,这道题的corner case居然是int范围爆炸。。。。。。我也是醉了,太无聊了。

165

在这里插入图片描述
1.这道题比较简单,就while循环就完事儿了,函数返回value和下一个index,非法就返回-1
2.注意处理前导0,这个就分size==1讨论即可
3.字节跳动和微软都简单考察过这道题

166

在这里插入图片描述
1.字节跳动考察了不少次,然后微软考察的稍微少那么一点,不过确实是很重要的题目。
2.这一题要考虑的corner case实在是太多了。首先要考虑分子和分母为0的情况,然后是分子和分母的正负号情况,涉及到将一个负数取绝对值的话就一定要转换成long,大概就这些吧。
3.做法其实是非常简单的,核心就是:将余数每次扩大10倍,然后求小数部分!!!然后用一个哈希来表示是否出现过,然后出现的index是多少。
4.这道题乍一看真的很僵硬,其实要素就这些,建议复习时认真思考一遍!

173

在这里插入图片描述
1.微软和字节跳动考察的次数还不少。
2.一遍过!思路其实很简单,就是个中序遍历,维护一个stack,然后在构造函数中,先尽可能将左节点路径加入进去,如果没左子节点就停下来。然后查询是否还能迭代的方法是返回stack是否为空;
3.迭代逻辑其实很简单,先将stack的top的value返回,然后将其pop出去。看看这个点还有right没,有的话就加入stack,顺便给遍历一下,把尽可能多的left都加入进来。(记住,不管top节点有没有right,这个top都要pop出去!!!)
4.强烈建议复习时仔细回忆一遍,pass!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值