查看: 2907| 回复: 15
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 微软近期高频面试题分享 + 分析(十一)

 
全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
最近来巨硬面试的小朋友通过概率实在太低了,代码老是写不对,我们组已经十连拒了,不得不感叹,现在出的面试题越来越难了,我决定还是上来地里透透题,说点最近我们组面试常考高频题和解析(毕竟岗位机会也不能都让三锅霸占了对不)。招人艰难,看微软机会的小伙伴,也欢迎LinkedIn勾搭:

https://www.linkedin.com/in/andy-yongjian-deng-212977200/



注意打招呼的时候备注一下,方便识别友军,hhhh。

带娃有压力,尽量保持一周两更,大家海涵。


往期链接:

微软近期高频面试题分享 + 分析(一)

微软近期高频面试题分享 + 分析(二)

微软近期高频面试题分享 + 分析(三)

微软近期高频面试题分享 + 分析(四)

微软近期高频面试题分享 + 分析(五)

微软近期高频面试题分享 + 分析(六)

微软近期高频面试题分享 + 分析(七)

微软近期高频面试题分享 + 分析(八)

微软近期高频面试题分享 + 分析(九)

微软近期高频面试题分享 + 分析(十)

评分

参与人数 11大米 +16 收起 理由
liu5395 + 1 太有才了!
chillex0227 + 1 给你点个赞!
Exp1019 + 2 给你点个赞!
aprilxiao + 1 给你点个赞!
MrWang1992 + 1 给你点个赞!

查看全部评分


上一篇:关于BFS创建队列后,放入元素问题。。。。。。。。。。。。。
下一篇:求助一道路径的问题
全局:
手动点赞 lz V5
回复

使用道具 举报

推荐
 楼主| YankeeDoodle 2021-7-24 09:44:57 | 只看该作者
全局:
买卖股票的最佳时机 II  解析

和上一题 买卖股票的最佳时机 做法完全一样
区别就在` profit[1] = Math.max(profit[i-1][1], profit[i-1][0]-prices);`(可以不止一次的购买股票)

profit[j]表示在第i天获得获得的最大的利润(j=0表示手里没股票时的最大利润,j=1表示手里有股票时的最大利润)

今天我没有持有股票,有两种可能(`profit[j]`是这两种情况中利润最大的那个):
要么是我昨天就没有持有,然后今天选择 rest,所以我今天还是没有持有;
要么是我昨天持有股票,但是今天我 sell 了,所以我今天没有持有股票了。

今天我持有着股票,有两种可能(`profit[j]`是这两种情况中利润最大的那个):
要么我昨天就持有着股票,然后今天选择 rest,所以我今天还持有着股票;
要么我昨天本没有持有,但今天我选择 buy,所以今天我就持有股票了。

遍历出所有的情况,在`profit[prices.length-1][0]`处为最大利润,因为profit在遍历时一直取max,只增大不减小,并且没有股票时(j=0)的利润高于有股票时(j=1)[i][i][i][i][i][i][i][i][i]

  1. class Solution {
  2.     public int maxProfit(int[] prices) {
  3.         int profit[][] = new int[prices.length][2];
  4.         profit[0][0] = 0;
  5.         profit[0][1] = -prices[0];
  6.         for(int i=1; i<prices.length; i++){
  7.             profit[i][0] = Math.max(profit[i-1][0], profit[i-1][1]+prices[i]);
  8.             profit[i][1] = Math.max(profit[i-1][1], profit[i-1][0]-prices[i]);
  9.         }
  10.         return profit[prices.length-1][0];
  11.     }
  12. }
复制代码



[/i][/i][/i][/i][/i][/i][/i][/i][/i]新状态只和相邻的一个状态有关,那就可以降低空间复杂度[i][i][i][i][i][i][/i][/i][/i][/i][/i][/i]
[i][i][i][i][i][i][i][i]
  1. class Solution {
  2.     public int maxProfit(int[] prices) {
  3.         int profit_0 = 0, profit_1 = -prices[0], profit_0_pre = 0;        //profit_0即profit[i-1][0],profit_1即profit[i-1][1]
  4.         for(int i=1; i<prices.length; i++){
  5.             profit_0 = Math.max(profit_0, profit_1+prices[i]);  //profit_0_pre是为了避免因profit_0的更新而丢失profit[i-1][0]
  6.             profit_1 = Math.max(profit_1, profit_0_pre-prices[i]);
  7.             profit_0_pre = profit_0;
  8.         }
  9.         return profit_0;
  10.     }
  11. }
复制代码

[/i][/i][/i][/i][/i][/i][/i][/i]
回复

使用道具 举报

推荐
 楼主| YankeeDoodle 2021-7-28 09:24:52 | 只看该作者
全局:
最佳买卖股票时机含冷冻期  解析

一样的解题模板
做法与上一题  买卖股票的最佳时机 II 完全一样
解析也一样
只不过为了处理冷冻期,购买只能根据`profit[i-2][0]`  
  1. class Solution {
  2.     public int maxProfit(int[] prices) {
  3.         int profit[][] = new int[prices.length][2];
  4.         int preProfit = 0;
  5.         profit[0][0] = 0;
  6.         profit[0][1] = -prices[0];
  7.         for(int i=1 ; i<prices.length; i++){
  8.             if(i==1){   //避免profit[i-2][0]中i-2数组越界,把i=1从循环中提出来
  9.                 preProfit=0;
  10.             }else{
  11.                 preProfit=profit[i-2][0];
  12.             }
  13.             profit[i][0] = Math.max(profit[i-1][0], profit[i-1][1]+prices[i]);
  14.             profit[i][1] = Math.max(profit[i-1][1], preProfit-prices[i]);
  15.         }
  16.         return profit[prices.length-1][0];

  17.     }
  18. }
复制代码



同理降低空间复杂度
  1. class Solution {
  2.     public int maxProfit(int[] prices) {
  3.         int profit_0 = 0, profit_1 = -prices[0], preProfit_0 = 0;   //preProfit_0是profit[i-2][0]
  4.         for(int i=1 ; i<prices.length; i++){
  5.             int temp = profit_0;
  6.             profit_0 = Math.max(profit_0,profit_1+prices[i]);
  7.             profit_1 = Math.max(profit_1,preProfit_0-prices[i]);
  8.             preProfit_0 = temp;
  9.         }
  10.         return profit_0;
  11.     }
  12. }
复制代码



回复

使用道具 举报

🔗
 楼主| YankeeDoodle 2021-7-21 10:02:57 | 只看该作者
全局:
本期主要讨论股票买卖问题,由浅入深

评分

参与人数 1大米 +2 收起 理由
JDS-Shirayuki + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
 楼主| YankeeDoodle 2021-7-21 10:03:41 | 只看该作者
全局:
买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

评分

参与人数 1大米 +2 收起 理由
JDS-Shirayuki + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
 楼主| YankeeDoodle 2021-7-22 09:36:14 | 只看该作者
全局:
profit[i][j]表示在第i天获得获得的最大的利润(j=0表示手里没股票时的最大利润,j=1表示手里有股票时的最大利润)


今天我没有持有股票,有两种可能(profit[i][j]是这两种情况中利润最大的那个):
要么是我昨天就没有持有,然后今天选择 rest,所以我今天还是没有持有;
要么是我昨天持有股票,但是今天我 sell 了,所以我今天没有持有股票了。

今天我持有着股票,有两种可能(profit[i][j]是这两种情况中利润最大的那个):
要么我昨天就持有着股票,然后今天选择 rest,所以我今天还持有着股票;
要么我昨天本没有持有,但今天我选择 buy,所以今天我就持有股票了。

遍历出所有的情况,在profit[prices.length-1][0]处为最大利润,因为profit在遍历时一直取max,只增大不减小,并且没有股票时(j=0)的利润高于有股票时(j=1)

  1. class Solution {
  2.     public int maxProfit(int[] prices) {
  3.         int profit[][] = new int[prices.length][2];
  4.         profit[0][1] = -prices[0];
  5.         profit[0][0] = 0;
  6.         for(int i=1; i<prices.length; i++){
  7.             profit[i][1] = Math.max(profit[i-1][1], -prices[i]);
  8.             profit[i][0] = Math.max(profit[i-1][0], profit[i-1][1]+prices[i]);
  9.         }
  10.         return profit[prices.length-1][0];
  11.     }
  12. }
复制代码



新状态只和相邻的一个状态有关,那就可以降低空间复杂度,profit_1即profit[i-1][1],profit_0即profit[i-1][0]
  1. class Solution {
  2.     public int maxProfit(int[] prices) {
  3.         int profit_0 = 0, profit_1 = -prices[0];
  4.         for(int i=0; i<prices.length; i++){
  5.             profit_1 = Math.max(profit_1, -prices[i]);
  6.             profit_0 = Math.max(profit_0, profit_1+prices[i]);
  7.         }
  8.         return profit_0;
  9.     }
  10. }
复制代码





评分

参与人数 1大米 +2 收起 理由
JDS-Shirayuki + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

全局:
楼主坚持了好久啊
回复

使用道具 举报

🔗
JDS-Shirayuki 2021-7-22 22:52:08 | 只看该作者
全局:
我是LZ的大fans
回复

使用道具 举报

🔗
 楼主| YankeeDoodle 2021-7-23 10:02:45 | 只看该作者
全局:
本帖最后由 YankeeDoodle 于 2021-7-23 10:04 编辑

买卖股票的最佳时机 II

给定一个数组 prices ,其中 prices 是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

  1. 示例 1:
  2. 输入: prices = [7,1,5,3,6,4]
  3. 输出: 7
  4. 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
  5.      随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

  6. 示例 2:
  7. 输入: prices = [1,2,3,4,5]
  8. 输出: 4
  9. 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
  10.      注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

  11. 示例 3:
  12. 输入: prices = [7,6,4,3,1]
  13. 输出: 0
  14. 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
复制代码

回复

使用道具 举报

🔗
 楼主| YankeeDoodle 2021-7-26 09:04:10 | 只看该作者
全局:
最佳买卖股票时机含冷冻期

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。
设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):
你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

示例:
输入: [1,2,3,0,2]
输出: 3
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表