通过万岁!!!
- 题目:股票的价格一直是波动的,进行了统计,然后给你一个数组,里面是timestamp和price分别表示统记的时间和统计时的价格,然后问任意时刻的最新价格(调用current方法)、之前的最高价格(调用maximum方法)、之前的最低价格(调用minimum方法)。然后还有就是更新和添加的方法update传入的就是timestamp和price,然后如果两次输入的时间点一样,就表示之前的输出错了。
- 思路:
- 首先我们需要一个map,这个map需要按照key进行排序。这样,我们把时间当作key,每次获取当前的时候,我们返回这个map的最大的key对应的value即可。
- 然后就是对价格以及价格变化的分析。首先我们的价格也应该是排序的,这样才能获取这个最大值,和最小值。但是插入就排序的数组好像是没有的,或者自己定义一个。这里没有自己定义,因为我们上面说了,map中有对key进行排序的,我们就用它就行了。
- 然后就是问题的关键了,你修改这个如果是最大的或者最小的(这里我们按照修改最大的来分析),那最大的价格变成了啥?变成了之前第二大的对吧?但是之前第二大的是多少?有可能等于这个最大的,也有可能小于这个最大的,对吧。
- 小于时候很好理解。下面说一下等于的时候。
- 第一天记录的是10,那么最大的是10,第二天记录的也是10,最大的还是10,然后发现第一天录入错了应该是5,那么你说最大的应该是多少?是不是10,这个10是二天录入的。你修改的是第一天的。
- 这样我们就需要记录这个最大的是第几天录入的,但是太麻烦了,完全不用,我们只需要知道这个最大的有几天就可以了。如果有两天,那么修改一天以后,最大值还是不变即可,但是录入的天数就是1了。这个次数我们完全可以用这个map的value来记录啊。如果已经是1了,直接删除这个键值对。完美!
- 技巧:TreeMap,这是一个可以按照key进行排序的map。
伪代码
成员变量中首先定义两个map,分别叫timeMap和priceMap,分别表示时间-价格的map和价格-天数的map
构造方法中
初始化这两个map,这里可以对map进行排序条件的设置。这里两个map都是升序即可,默认就是升序。
然后就是更新的方法
我们通过timeMap看这个时间之前存储过了没有,如果存储过
那么就获取之存储的价格是多少,然后通过priceMap获取有多少天
如果天数等于1
直接删除这个键值对,因为之前填错了
否则天数一定是大于1的
将天数-1,重新入map,因为之前填错了
注意,这里没有timeMap不存在的否则,因为存在的时候,我们只是修改了错误内容,并没有添加正确内容,下面添加正确内容,并且如果timeMap中不存在下面的内容也要执行。
首先,timeMap中现在传入的时间节点和价格
然后判断这个价格是不是在priceMap中,如果存在
则将原priceMap中对应的value加1
否则
不存在,则直接加入,并且值设置为1
获取当前最新的方法
直接拿timeMap中最大值的key对应的value即可
获取最大的价格的方法
直接拿priceMap中最大的值
获取最小的价格的方法
直接拿priceMap中最小的值
java代码
class StockPrice {
TreeMap<Integer, Integer> timeMap;
TreeMap<Integer, Integer> priceMap;
public StockPrice() {
// 按照key升序的map
timeMap = new TreeMap<Integer, Integer>();
priceMap = new TreeMap<Integer, Integer>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return o1 - o2;
}
});
}
public void update(int timestamp, int price) {
if (timeMap.containsKey(timestamp)) {// 这个时间之前存过
Integer oldPrice = timeMap.get(timestamp);
Integer timeNum = priceMap.get(oldPrice);// 通过时间获取旧价格,再通过价格获取时间列表
if (timeNum == 1) {// 直接将priceMap中存在的删除
priceMap.remove(timeMap.get(timestamp));
} else {
priceMap.put(oldPrice, timeNum - 1);
}
}
timeMap.put(timestamp, price);
if (priceMap.containsKey(price))
priceMap.put(price, priceMap.get(price) + 1);
else
priceMap.put(price, 1);
}
public int current() {
return timeMap.get(timeMap.lastKey());
}
public int maximum() {
return priceMap.lastKey();
}
public int minimum() {
return priceMap.firstKey();
}
}
- 总结:题目不是很难,主要是需要用到一个能够排序的map。并且两个map一定要明确key和value中存储什么内容。