Formatted question description: https://leetcode.ca/all/1656.html

1656. Design an Ordered Stream

Level

Easy

Description

There are n (id, value) pairs, where id is an integer between 1 and n and value is a string. No two pairs have the same id.

Design a stream that takes the n pairs in an arbitrary order, and returns the values over several calls in increasing order of their ids.

Implement the OrderedStream class:

  • OrderedStream(int n) Constructs the stream to take n values and sets a current ptr to 1.
  • String[] insert(int id, String value) Stores the new (id, value) pair in the stream. After storing the pair:
    • If the stream has stored a pair with id = ptr, then find the longest contiguous incrementing sequence of ids starting with id = ptr and return a list of the values associated with those ids in order. Then, update ptr to the last id + 1.
    • Otherwise, return an empty list.

Example:

Image text

Input
["OrderedStream", "insert", "insert", "insert", "insert", "insert"]
[[5], [3, "ccccc"], [1, "aaaaa"], [2, "bbbbb"], [5, "eeeee"], [4, "ddddd"]]
Output
[null, [], ["aaaaa"], ["bbbbb", "ccccc"], [], ["ddddd", "eeeee"]]

Explanation
OrderedStream os= new OrderedStream(5);
os.insert(3, "ccccc"); // Inserts (3, "ccccc"), returns [].
os.insert(1, "aaaaa"); // Inserts (1, "aaaaa"), returns ["aaaaa"].
os.insert(2, "bbbbb"); // Inserts (2, "bbbbb"), returns ["bbbbb", "ccccc"].
os.insert(5, "eeeee"); // Inserts (5, "eeeee"), returns [].
os.insert(4, "ddddd"); // Inserts (4, "ddddd"), returns ["ddddd", "eeeee"].

Constraints:

  • 1 <= n <= 1000
  • 1 <= id <= n
  • value.length == 5
  • value consists only of lowercase letters.
  • Each call to insert will have a unique id.
  • Exactly n calls will be made to insert.

Solution

Use a map to store (id, value) pairs, and maintain ptr and n.

For the constructor, initialize ptr = 1 and n to be the parameter n, and initialize the map.

For the method insert, put the (id, value) pair into the map. If id == ptr, then loop over all possible ids from ptr until the id does not exist in the map. Use a list to store the values and return the list.

class OrderedStream {
    int ptr;
    int n;
    Map<Integer, String> map;

    public OrderedStream(int n) {
        this.ptr = 1;
        this.n = n;
        this.map = new HashMap<Integer, String>();
    }
    
    public List<String> insert(int id, String value) {
        map.put(id, value);
        List<String> list = new ArrayList<String>();
        if (id == ptr) {
            for (int i = ptr; i <= n && map.containsKey(i); i++) {
                list.add(map.get(i));
                ptr = i + 1;
            }
        }
        return list;
    }
}

/**
 * Your OrderedStream object will be instantiated and called as such:
 * OrderedStream obj = new OrderedStream(n);
 * List<String> param_1 = obj.insert(id,value);
 */

All Problems

All Solutions