恒生电子2023年实习春招笔试第二题(编程)
最近写了恒生电子的笔试,故在此记录.....
题目:股票
题目大概是:
给定一个数组prices,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
其中本金M为10000元,给定股票价格的7天变化即prices数组:[1.0,2.0,1.0,2.0,2.0,3.0,2.0](这里开始与leetcode上的股票题不一样了)求出最大利润。
思路:这题我使用动态规划的思路。
第一步:定义dp数组的意义:
其中dp[i][0]我定义为第i天所持有的股票数,dp[i][1]定义为第i天不持有股票时所能获得的现金数。
第二步:确定递归公式:
dp[i][0] =max(dp[i-1][0],dp[i-1][1]/prices[i]);这样做可以保证在变化的股市里能拿到最值得的股票数。其中dp[i-1][0]就是第i-1天我手中的股票数,dp[i-1][1]/prices[i]表示的就是我第i-1天不持有股票时的现金数去除当天的股价就可以得到股票数。通俗来讲就是我用现在的钱去买现在股市的股票是不是能获得更多,比我之前握在手中不卖会不会更值。
dp[i][1] = max(dp[i - 1][1], dp[i - 1][0]*prices[i]);要么就是延续之前的状态即dp[i-1][1],要么就是将前一天手中的股票给卖了(dp[i - 1][0]*prices[i]),两个求较大值。
第三步:初始化dp[][]数组:
其中两个状态分别是初始时的股票数dp[0][0]与现金数dp[0][1]。dp[0][0] =M/prices[0];//初始持有股票数
dp[0][1] = M;//最开始就为本金M=10000元
第四步:确定遍历顺序:
由题可知dp[i][1]的求出需要依赖dp[i-1][1]与dp[i-1][0]。所以从左向右遍历。
第五步:举例推导:prices[i]={1.0,2.0,1.0,2.0,2.0,3.0,2.0}注意推导从prices[1]开始
dp[1][0]=max(10000股,5000股)=10000股;
dp[1][1]=max(10000元,20000元)=20000元;
dp[2][0]=max(dp[1][0],dp[1][1]/prices[2])=20000股
dp[2][1]=max(dp[1][1],dp[1][0]*prices[2])=20000元
dp[3][0]=20000股
dp[3][1]=max(dp[2][1],dp[2][0]*prices[3])=40000元
dp[4][0]=20000股
dp[4][1]=40000元
dp[5][0]=max(20000,40000/3.0)=20000股
dp[5][1]=max(40000,20000*3.0)=60000元
dp[6][0]=max(20000,60000/2.0)=30000股
dp[6][1]=max(60000,30000*2.0)=60000元
即dp[6][1]为最大毛利润。
其中可以看到dp[5][1]与dp[6][1]所求的值一样,这是因为我们只知道7天的股市变化,而dp[6][1]就是把之前赚到的钱在最后一天里继续全部买下股票,然后再在当天继续卖出,等于是没有赚。赚的钱还是之前你所赚的。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
double M=10000.0;
double maxProfit(vector<double>& prices) {int len = prices.size();vector<vector<double>> dp(len, vector<double>(2, 0));dp[0][0] =M/prices[0];//持有股票数dp[0][1] = M;//卖出股票所得现金for (int i = 1; i < len; i++) {dp[i][0] =max(dp[i-1][0],dp[i-1][1]/prices[i]); //锁定最值得的股票数dp[i][1] = max(dp[i - 1][1], dp[i - 1][0]*prices[i]);//即获得的毛利润}return dp[len - 1][1];//最大毛利润
}
int main() {vector<double>p = {1.0,2.0,1.0,2.0,2.0,3.0,2.0};cout<<maxProfit(p)-M;}
结果:50000;dp[len-1][1]-M:即为纯利润。
恒生电子2023年实习春招笔试第二题(编程)相关推荐
- 网易2017春招笔试真题编程题集合
网易2017春招笔试真题编程题集合 题目来源:牛客网 https://www.nowcoder.com/profile/7952866/test/7811777/83061 1.双核处理 题目描述 一 ...
- 题解-百度2017春招笔试真题编程题集合
题目链接:https://www.nowcoder.com/test/4998655/summary 一共五题,从第五题开始写,难度由难到易 ----------------------------- ...
- 网易2017春招笔试真题编程题集合(2)——赶去公司
时间限制:1秒 空间限制:32768K 终于到周末啦!小易走在市区的街道上准备找朋友聚会,突然服务器发来警报,小易需要立即回公司修复这个紧急bug.假设市区是一个无限大的区域,每条街道假设坐标是(X, ...
- 网易2017春招笔试真题编程题集合(5)——魔力手环
小易拥有一个拥有魔力的手环上面有n个数字(构成一个环),当这个魔力手环每次使用魔力的时候就会发生一种奇特的变化:每个数字会变成自己跟后面一个数字的和(最后一个数字的后面一个数字是第一个),一旦某个位置 ...
- 滴滴出行2017秋招笔试真题-编程题汇总_Java实现
滴滴出行2017秋招笔试真题-编程题汇总_Java实现 注:有的题参考别人的思路,用我最容易理解的代码编的程序,所以可以不能最优的解法,后续我会进行更新,只是一个思路,我的笔记而已,所以不喜勿喷~~~ ...
- 360春招笔试算法题题解
A. 跑步(水) 题目描述 小明同学喜欢体育锻炼,他常常去操场上跑步.跑道是一个圆形,在本题中,我们认为跑道是一个半径为R的圆形,设圆心的坐标为原点(0,0). 小明跑步的起点坐标为(R,0),他沿着 ...
- 2021中国农业银行(浙江省分信息科技岗)春招笔试编程题(待更)
2021中国农业银行春招笔试共计三道编程题题目,详解如下: 题目一 def list_to_set(ls):len_ls = ls[-1] - ls[0]ls0 = [ls[0]]for i in r ...
- 2023银行春招笔试经验分享!
根据如信银行考试中心发布: Q:银行春季招聘的笔试什么时候开始?考核?难不难? A:各大银行春季招考的笔试时间多在4月份,而四大行则一般安排在4月中旬的一个周末:就拿去年中国工商银行一般科目的笔试来说 ...
- 华为2018春招笔试题目 字节流解析与长整数相乘
基础知识杂烩: 字节也叫Byte,是计算机数据的基本存储单位, bit存储内容是0和1,bit是计算机中最小的储存单位 一个Byte是由8个bit组成,它是最小的可寻址单元 ,1个字节等于8位二进制. ...
最新文章
- Win2008学习(二),群集的仲裁配置
- LVM 类型的 Storage Pool - 每天5分钟玩转 OpenStack(8)
- Jmeter连接mysql(一)
- ngod规范_NGOD的架构说明与比较
- java查看jvm对象个数_jmap-查看 jvm 内存对象信息
- feko软件_计算电磁学各种方法和电磁仿真软件简述
- tomcat设置http自动跳转为https访问
- 矩阵的Cholesky分解
- Java SE 疑难点记录
- Mysql 排序null值 排序问题分析
- tftp上传下载命令
- MEGA2560 arduino烧录USB 芯片flash以及bootloader记录
- KETTLE将txt文本文件加载入库
- ios storyboard 传参 返回传参(segue)
- 大型文件传输,前后端分别怎么处理?
- 做新媒体短视频运营需要什么技能
- TF卡和SD卡的区别
- Spring Boot自定义starter必知必会条件
- 【有利可图网】PS实战系列:PS美化婚纱照片
- 自动化运维为什么是必须的?
热门文章
- 智慧职教云Java题库_智慧职教云课堂APPJava程序设计试题及答案
- element ui 图片加载失败_element图片懒加载的问题
- 设计模式C++实现(20)——解释器模式
- 国际商业美术设计师阿里云开发首页
- 1527. 患某种疾病的患者(SQL)
- 最好用的便笺免费下载及教程
- Android 9.0实现系统内录(只录制系统声音)
- Ubuntu20.04上切换系统声音( by quqi99)
- 求推荐一个手机、电脑、网页端三平台通用的桌面便签工具
- conway生命小游戏,实现细胞普通行为