leetcode
leetcode 2201 ~ 2250
找到数据流中的连续整数

找到数据流中的连续整数

难度:

标签:

题目描述

For a stream of integers, implement a data structure that checks if the last k integers parsed in the stream are equal to value.

Implement the DataStream class:

  • DataStream(int value, int k) Initializes the object with an empty integer stream and the two integers value and k.
  • boolean consec(int num) Adds num to the stream of integers. Returns true if the last k integers are equal to value, and false otherwise. If there are less than k integers, the condition does not hold true, so returns false.

 

Example 1:

Input
["DataStream", "consec", "consec", "consec", "consec"]
[[4, 3], [4], [4], [4], [3]]
Output
[null, false, false, true, false]

Explanation
DataStream dataStream = new DataStream(4, 3); //value = 4, k = 3 
dataStream.consec(4); // Only 1 integer is parsed, so returns False. 
dataStream.consec(4); // Only 2 integers are parsed.
                      // Since 2 is less than k, returns False. 
dataStream.consec(4); // The 3 integers parsed are all equal to value, so returns True. 
dataStream.consec(3); // The last k integers parsed in the stream are [4,4,3].
                      // Since 3 is not equal to value, it returns False.

 

Constraints:

  • 1 <= value, num <= 109
  • 1 <= k <= 105
  • At most 105 calls will be made to consec.

代码结果

运行时间: 304 ms, 内存: 46.7 MB


/*
题目思路:
1. 创建一个 DataStream 类,该类有两个成员变量:一个用来存储整数数据流的列表,一个用来存储目标值 value 和 k 的值。
2. 构造函数初始化 value 和 k。
3. consec 方法使用 Stream API 将整数添加到数据流中,并检查最后 k 个整数是否都等于 value。
*/
import java.util.*;
import java.util.stream.*;

public class DataStream {
    private int value;
    private int k;
    private List<Integer> stream;

    public DataStream(int value, int k) {
        this.value = value;
        this.k = k;
        this.stream = new ArrayList<>();
    }

    public boolean consec(int num) {
        stream.add(num);
        if (stream.size() < k) {
            return false;
        }
        return stream.subList(stream.size() - k, stream.size()).stream().allMatch(n -> n == value);
    }
}

解释

方法:

此题解采用的是一种计数方法来检查数据流中最后 k 个整数是否等于初始化时指定的 value。在构造函数中,初始化 value 和 k 的值,并设置一个计数器 cnt 用于记录连续等于 value 的整数数量。在 consec 方法中,每次调用时都会将传入的整数 num 与 value 进行比较。如果 num 等于 value,则增加计数器 cnt;否则,重置计数器 cnt 为 0。最后,如果 cnt 的值大于等于 k,则返回 true 表示最后 k 个整数都等于 value,否则返回 false。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
初始化DataStream类时,为什么选择存储`value`和`k`作为实例变量,而不是每次调用`consec`时传递这些参数?
在DataStream类中,`value`和`k`被定义为实例变量,这是因为它们对于对象的整个生命周期都是必要的,并且在多次调用`consec`方法时保持不变。将这些参数作为实例变量存储,避免了每次调用方法时重复传递相同的参数,从而简化了方法的调用,并且使得类的设计更加符合面向对象的封装性原则。
🦆
在DataStream的实现中,`cnt`变量的作用是什么,它是如何确保只计算最后k个数的?
`cnt`变量在DataStream类中用于记录连续出现目标值`value`的次数。当新加入的数字等于`value`时,`cnt`递增;若不等,则`cnt`重置为0。这样的机制确保了只有当最近连续的数字全部等于`value`时,`cnt`的值才会达到或超过`k`。但实际上,`cnt`并不直接限制只计算最后k个数,而是连续计数,如果连续数字超过k个,`cnt`也会继续增长。
🦆
题解中提到,如果连续数的计数`cnt`达到或超过k,就返回true。但如果数据流中的数字数量少于k个,该如何处理?
如果数据流中的数字数量少于k个,由于`cnt`只在连续出现目标值时增加,且必须连续出现`value`才会导致`cnt`达到k,因此在数据流中的数字数量少于k个的情况下,`cnt`值不可能达到k。在这种情况下,`consec`方法将始终返回false,因为还没有足够的数字来满足连续k个数等于`value`的条件。
🦆
题解采用`cnt`变量来跟踪连续相等的数字,但如果在达到k个连续数字后,再次添加一个不等于`value`的数字,`cnt`如何更新?
在`DataStream`类的实现中,如果在达到或超过k个连续数字等于`value`之后,再次添加一个不等于`value`的数字,`cnt`将被立即重置为0。这是因为`cnt`的设计是用来跟踪当前连续的等于`value`的数字数量,一旦遇到一个不等的值,之前的连续计数失效,需要重新开始计数。

相关问题