zoukankan      html  css  js  c++  java
  • leetcode 900. RLE Iterator

    Write an iterator that iterates through a run-length encoded sequence.

    The iterator is initialized by RLEIterator(int[] A), where A is a run-length encoding of some sequence. More specifically, for all even i, A[i] tells us the number of times that the non-negative integer value A[i+1] is repeated in the sequence.

    The iterator supports one function: next(int n), which exhausts the next n elements (n >= 1) and returns the last element exhausted in this way. If there is no element left to exhaust, next returns -1 instead.

    For example, we start with A = [3,8,0,9,2,5], which is a run-length encoding of the sequence [8,8,8,5,5]. This is because the sequence can be read as "three eights, zero nines, two fives".

    Example 1:
    
    Input: ["RLEIterator","next","next","next","next"], [[[3,8,0,9,2,5]],[2],[1],[1],[2]]
    Output: [null,8,8,5,-1]
    Explanation: 
    RLEIterator is initialized with RLEIterator([3,8,0,9,2,5]).
    This maps to the sequence [8,8,8,5,5].
    RLEIterator.next is then called 4 times:
    
    .next(2) exhausts 2 terms of the sequence, returning 8.  The remaining sequence is now [8, 5, 5].
    
    .next(1) exhausts 1 term of the sequence, returning 8.  The remaining sequence is now [5, 5].
    
    .next(1) exhausts 1 term of the sequence, returning 5.  The remaining sequence is now [5].
    
    .next(2) exhausts 2 terms, returning -1.  This is because the first term exhausted was 5,
    but the second term did not exist.  Since the last term exhausted does not exist, we return -1.
    
    Note:
    
    0 <= A.length <= 1000
    A.length is an even integer.
    0 <= A[i] <= 10^9
    There are at most 1000 calls to RLEIterator.next(int n) per test case.
    Each call to RLEIterator.next(int n) will have 1 <= n <= 10^9.
    

    题意:每次取n个数,返回这n个数,最后的那一个。
    模拟一下。

    class RLEIterator {
    public:
        queue<pair<int,int> > q;
        RLEIterator(vector<int> A) {
            for (int i = 0; i < A.size()-1; i+= 2) {
                int x = A[i];
                int y = A[i+1];
                //mp[y] = x;// y有x个 
                q.push({y,x});
            }
        }
        
        int next(int n) {
            while (!q.empty() && n > 0) {
                auto &x  = q.front();
                if (x.second >= n) {
                    x.second -= n;
                    if (x.second  == 0) q.pop();
                    return x.first;
                } else {
                    n -= x.second;
                    q.pop();
                }
            }
            return -1;
        }
    };
    
    /**
     * Your RLEIterator object will be instantiated and called as such:
     * RLEIterator obj = new RLEIterator(A);
     * int param_1 = obj.next(n);
     */
    
  • 相关阅读:
    js固定在顶部
    css垂直居中
    HTML 5离线存储
    jdbc数据库操作
    I/O输入输出流
    异常处理
    java实现冒泡排序算法
    Java 方法
    java 循环 基本类型
    Java中Arrays工具类
  • 原文地址:https://www.cnblogs.com/pk28/p/9613772.html
Copyright © 2011-2022 走看看