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);
     */
    
  • 相关阅读:
    Android BlueDroid(一):BlueDroid概述 【转】
    halcon学习笔记——机器视觉工程应用的开发思路【转】
    git log用法【转】
    git 使用详解(5)-- get log 查看提交历史【转】
    10 个迅速提升你 Git 水平的提示【转】
    触摸屏学习笔记---自容与互容【原创】
    Linux按键驱动程序设计详解---从简单到不简单【转】
    LCD参数解释及计算【转】
    5.24 Declaring Attributes of Functions【转】
    【SVN Working copy is too old (format 10, created by Subversion 1.6)】解决方式
  • 原文地址:https://www.cnblogs.com/pk28/p/9613772.html
Copyright © 2011-2022 走看看