07/18/2016更新
改为queue来做,最初的做法太2了。
public class MovingAverage {
Queue<Integer> list;
int size = 0;
int sum = 0;
/** Initialize your data structure here. */
public MovingAverage(int size) {
list = new LinkedList<>();
this.size = size;
}
public double next(int val) {
double result = 0.0;
if (list.size() < size) {
sum = sum + val;
list.offer(val);
result = (double)sum / list.size();
} else {
int deletedNum = list.poll();
sum = sum - deletedNum;
sum = sum + val;
result = (double)sum / size;
list.offer(val);
}
return result;
}
}
/**
* Your MovingAverage object will be instantiated and called as such:
* MovingAverage obj = new MovingAverage(size);
* double param_1 = obj.next(val);
*/
一道设计题,有3点
1. 一开始,自己用的是queue来做,但是发现,若想每次peek下一个值,都得先poll,这才发现当中问题,改成了list来做,可以做到get(index),所以用queue和用queue的思想来解决问题是完全不同的做法。
2. 数值转换,如何从int转为double,看当中的错误
3. 逻辑的bug,致命
public class MovingAverage {
List<Integer> list;
int size = 0;
int index = 0;
/** Initialize your data structure here. */
public MovingAverage(int size) {
list = new ArrayList<>();
this.size = size;
}
public double next(int val) {
int sum = 0;
double result = 0.0;
list.add(val);
if (list.size() < size) {
for (int i = 0; i < list.size(); i++) {
sum = sum + list.get(i);
}
//result = sum / list.size();
result = (double)sum / list.size();
} else {
//for (int i = index; i < size; i++) {
for (int i = index; i < index + size; i++) {
sum = sum + list.get(i);
}
//result = sum / size;
result = (double)sum / size;
index++;
}
return result;
}
}
/**
* Your MovingAverage object will be instantiated and called as such:
* MovingAverage obj = new MovingAverage(size);
* double param_1 = obj.next(val);
*/