题目描述:

股票最大收益问题
给定一段时间的某支股票价格集合,允许买卖各一次,求最大收益是多少?

例如

给定收入序列:[4,5,9,2,5,4,8]
为了满足要求,我们在第四天买入,第七天卖出,收益最大为6

结题思路:

暴力求解法的话,这里就不过多赘述了。博主当时脑子瓦特了,直接写了一波暴力解,复杂度当然就是O(n^2)了。面试官理所当然的很不满意,问我能不能优化。

沉思之后,我猛然发现这是一个典型的动态规划问题,动态规划的思想我就不说了,还请打开百度,移步其他博客。

针对此题,我做一个简单分析。一只股票,我们肯定要先买后卖(买入必定在卖出之前发生),也就是说我们收益最少也是0元(当天买入当天卖出)。所以我们只需要遍历一遍序列即可求的解。在遍历中,我们维持一个买入的最低价和一个当前最大收益,并且用遍历到的价格减去最低价来获得当前卖出可获得的最大收益的值,我们在这个收益值与历史最大收益值中取较大的一个即可。使用此办法之后,时间复杂度瞬间降到了O(n),面试官脸上也露出些许欣喜之色。

C++代码:

#include <iostream>
#include <vector>using namespace std;/* run this program using the console pauser or add your own getch, system("pause") or input loop */int GetMaxIncome(vector<int> price){if(price.size() <= 1) return 0; //处理特殊情况int minPrice = price[0]; //维持一个最小值 int maxIncome = 0; //记录最大收益 for(int i = 1; i < price.size(); ++i){if(price[i] < minPrice){ //找到一个比当前最低价格还要低的价格,则替换之 minPrice = price[i];continue;}else{int currentIncome = price[i] - minPrice; //比较当前卖出的收益与之前记录的最大收益 if(currentIncome > maxIncome){maxIncome = currentIncome;}} }return maxIncome;
}int main(int argc, char** argv) {vector<int> price;price.push_back(4);price.push_back(5);price.push_back(9);price.push_back(2);price.push_back(5);price.push_back(4);price.push_back(8);//price.push_back(4);cout << GetMaxIncome(price);return 0;
}

后续:

你以为这就结束了?NO! NO! NO!

你以为面试官是那么好糊弄的?

于是,我立马收到了如下进阶版题目:

如果将买卖改为各两次,则最大收益是多少?
序列同上
在第一天买入,第三天卖出,第四天买入,第七天卖出,则收益为5+6。

当然了,迫于时间关系,面试官只要求我给出大概结题思路即可。

由于我比较菜,我说出了暴力解法,然后提了一嘴或许可以用二分法和递归结和来求解,但是具体操作我不会。

幸运的是面试官把我放过去了,我就迎来了字节标志性的连面,进入到紧张刺激的三面环节!

字节跳动面试--二面算法题复盘相关推荐

  1. 来,做一道字节跳动面试的简单算法题

    面试大厂,算法基本是必面的,特别是字节跳动,技术面最后一个问题就是算法题,这次给大家带来一道字节跳动面试出的一道简单算法题. 请听题: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递 ...

  2. 字节跳动2019春招算法题

    字节跳动2019春招算法题 1.总结 难度:容易到中等. 一些题出的太烂,不给数据范围,而且内存设置有问题,如果是刷题不建议刷. 2.题目 (1) 简单字符串模拟. #include<bits/ ...

  3. 合并K个有序数组(链表)【字节跳动面试算法题】

    本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...

  4. 字节跳动面试算法题目以及答案

    题目来源于牛客 https://www.nowcoder.com/discuss/455003?type=post&order=time&pos=&page=2&cha ...

  5. 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案

    2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...

  6. 字节跳动面试官:你离50w年薪就差答对了这个算法题!

    我有个朋友,最近去头条面试,因为算法题没写出来,直接面挂了,搞得他非常郁闷. 众所周知,算法对程序员来说越来越重要了,但是总有人抱有一丝侥幸,不肯投入精力去学习,想着现在的工作中反正也用不到,等找工作 ...

  7. 2021届 字节跳动 按岗位汇总算法高频题(统计牛客大量面经所得)

    下列表中序号为 LeetCode 题号 字节跳动 算法 公司 岗位 题目 次数 字节跳动 算法 33. 搜索旋转排序数组 1 字节跳动 算法 200. 岛屿数量 1 字节跳动 算法 215. 数组中的 ...

  8. 字节跳动面试锦集(二):项目HR高频面试总结

    1.项目开发中遇到的最大的一个难题和挑战,你是如何解决的.(95% 会问到) 说说你开发最大的优势点(95% 会问到) 你为什么会离开上家公司 你的缺点是什么? 你能给公司带来什么效益? 你对未来的职 ...

  9. “作为字节跳动面试官,有些话我不得不说!”

    转载自字节跳动 由于肺炎疫情的影响,不少同学年初跳槽的计划被搁置.虽然计划被打乱,但是这也给我们留出时间更好的准备面试.随着企业复工时间的延长,不少公司裁员.降薪甚至倒闭,之后只会更难. 看了不少「面 ...

最新文章

  1. 轻量级web api_10个很棒的JavaScript库,提升Web开发效率
  2. java id生成器 分布式_分布式高效唯一ID生成器(sequence)
  3. unity3d所要知道的基础知识体系大纲,可以对照着学习,不定期更新
  4. cat查看tomcat日志 linux_linux怎么使用cat命令查看文件? linux中cat命令的使用方法
  5. 我想solo自己一个人!
  6. java正则表达式 类_java正则表达式相关类的使用
  7. python3 读取写入excel操作-win32com
  8. C 主导、C++与 C# 为辅,揭秘 Windows 10 源代码!
  9. Exchange 2010 迁移至Exchange 2013系列之一:系列架构介绍
  10. 在文件保存中 os.getcwd() os.listdir() os.makedirs() os.mkdir() xx.join() ... 等函数 的使用介绍...
  11. 独立游戏大电影观后感
  12. MATLAB的图像显示函数imshow()详解
  13. Docker入门教程
  14. 使用JDOM生成/解析XML文档
  15. OPPO消息推送服务器,OPPO开放平台消息推送申请教程
  16. idea里面java文件只读,Java只读集合
  17. 屏蔽CSDN广告插件 - Chrome
  18. ESLint:可组装的JavaScript和JSX检查工具
  19. IC学习笔记20——VCS的使用(一)仿真事件队列
  20. pyecharts折现面积图例题

热门文章

  1. matlab实现细胞分割,MATLAB图像处理实验——细胞图像的分割和计数
  2. 郝萌主的微信公众号上线了
  3. Python算法--杂乱字符串排序
  4. OJ1088: 手机短号 (多实例)(C语言)
  5. sensei鼠标测试软件,「硬核测试:游戏鼠标精准度」赛睿SENSEI 310
  6. 每日一问-ChapGPT-20230416-中医基础-经络
  7. 平方在c语言程序中怎么表示什么意思,c语言中的平方是怎么表示的?
  8. Masonry中的mas_makeConstraints方法
  9. 文件损坏怎么修复回来?
  10. IDEA搭建一个SpringBoot项目——十分详细(web+mysql)