目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
这道题是程序设计题,要我们实现一个类,一共是四个功能,第一个是给一个时间戳和价格,表示该时间的股票价格,我们需要记录下这个时间以及对应的价格,如果之前已经记录过这个时间戳了,那么我们需要更新。
第二个功能是获取最新的股票价格,也就是时间戳最大时的价格。
剩下的是获取股票的最大和最小的价格。
首先我们要获取股票的最大和最小价格,那么意味着我们需要对价格排序,我们要获取时间戳最大的数据,那么我们要对时间戳排序。既然都要排序,那么我们就无法在一个容器中同时实现,可以自动排序的容器有set和map,我们应该如何选择呢?
对时间戳排序的容器我们使用map,因为时间戳一对一一个股票价格,刚好符合map的键值对,我们直接取出map最后一个元素的值就是最新的股票价格了。
对股票价格排序的容器我们使用set,这样我们需要最大价格和最小价格时只需要出去set的最后一个元素和第一个元素即可。另外要注意的是,我们不能使用set,我们需要使用multiset,因为不同时间的股票价格是可能会重复的,而multiset可以多次存放相同的元素。
三个获取的函数我们就搞定了,接下来是更新数据的函数。
如果这个时间戳我们之前没有记录,那么我们正常存入map和set即可。如果这个时间我们之前记录了,由于我们要修改股票的价格,那么我们需要先把set中对应时间戳的股票价格给删除掉,再插入新的价格即可。
代码:
class StockPrice {
public:map<int,int>m; //存放时间与价格的对应关系multiset<int>s; //存放记录中股票的价格StockPrice() {}void update(int timestamp, int price) {//如果对应时间已经有了,那么需要更新股票价格,把记录中的原价格删除if(m.find(timestamp)!=m.end()){ s.erase(s.find(m[timestamp]));}//更新对应时间的股票价格以及存放记录中股票的价格m[timestamp]=price;s.insert(price);}int current() {//map底层自动排序,直接返回map中最后一个元素的secondreturn (*(m.rbegin())).second;}int maximum() {//set底层自动排序,直接返回set中最后一个元素return (*(s.rbegin()));}int minimum() {//set底层自动排序,直接返回set中第一个元素return (*(s.begin()));}
};