既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
文章目录
剑指 Offer II 041. 滑动窗口的平均值:
给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。
实现 MovingAverage
类:
MovingAverage(int size)
用窗口大小size
初始化对象。double next(int val)
成员函数next
每次调用的时候都会往滑动窗口增加一个整数,请计算并返回数据流中最后size
个值的移动平均值,即滑动窗口里所有数字的平均值。
样例 1:
输入:
inputs = ["MovingAverage", "next", "next", "next", "next"]
inputs = [[3], [1], [10], [3], [5]]
输出:
[null, 1.0, 5.5, 4.66667, 6.0]
解释:
MovingAverage movingAverage = new MovingAverage(3);
movingAverage.next(1); // 返回 1.0 = 1 / 1
movingAverage.next(10); // 返回 5.5 = (1 + 10) / 2
movingAverage.next(3); // 返回 4.66667 = (1 + 10 + 3) / 3
movingAverage.next(5); // 返回 6.0 = (10 + 3 + 5) / 3
提示:
- 1 <= size <= 1000
- -105 <= val <= 105
- 最多调用 next 方法 104 次
分析
- 面对这道算法题目,二当家的陷入了沉思。
- 计算平均值仅需要总值和数量,但是当数字的数量超过滑动窗口的大小时,就需要将前面的数字移除,先进先出,用队列实现最直观。
题解
rust
struct MovingAverage {
size: usize,
sum: i32,
q: std::collections::VecDeque<i32>,
}
/\*\*
\* `&self` means the method takes an immutable reference.
\* If you need a mutable reference, change it to `&mut self` instead.
\*/
impl MovingAverage {
/\*\* Initialize your data structure here. \*/
fn new(size: i32) -> Self {
MovingAverage{
size: size as usize,
sum: 0,
q: std::collections::VecDeque::new()
}
}
fn next(&mut self, val: i32) -> f64 {
if self.q.len() == self.size {
self.sum -= self.q.pop\_front().unwrap();
}
self.q.push\_back(val);
self.sum += val;
self.sum as f64 / self.q.len() as f64
}
}
/\*\*
\* Your MovingAverage object will be instantiated and called as such:
\* let obj = MovingAverage::new(size);
\* let ret\_1: f64 = obj.next(val);
\*/
go
type MovingAverage struct {
size int
sum int
q []int
}
/\*\* Initialize your data structure here. \*/
func Constructor(size int) MovingAverage {
return MovingAverage{size: size}
}
func (this \*MovingAverage) Next(val int) float64 {
if len(this.q) == this.size {
this.sum -= this.q[0]
this.q = this.q[1:]
}
this.sum += val
this.q = append(this.q, val)
return float64(this.sum) / float64(len(this.q))
}
/\*\*
\* Your MovingAverage object will be instantiated and called as such:
\* obj := Constructor(size);
\* param\_1 := obj.Next(val);
\*/
c++
class MovingAverage {
private:
int size;
int sum;
queue<int> q;
public:
/\*\* Initialize your data structure here. \*/
MovingAverage(int size) {
this->sum = 0;
this->size = size;
}
double next(int val) {
![img](https://img-blog.csdnimg.cn/img_convert/5eafda7be676e0cbef0ce7808a8c0e4b.png)
![img](https://img-blog.csdnimg.cn/img_convert/7568269468f3380caa0e44f8900af21d.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**