当前位置:网站首页>900. RLE 迭代器

900. RLE 迭代器

2022-06-23 06:14:00 毕业_设计

前言

C++是一种计算机高级程序设计语言,由C语言扩展升级而产生 ,最早于1979年由本贾尼·斯特劳斯特卢普在AT&T贝尔工作室研发。
C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计。
C++拥有计算机运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。

Java是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等 。

Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。
2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,20年来首次将其置于Java、C和JavaScript之上。

描述

我们可以使用游程编码(即 RLE )来编码一个整数序列。在偶数长度 encoding ( 从 0 开始 )的游程编码数组中,对于所有偶数 i ,encoding[i] 告诉我们非负整数 encoding[i + 1] 在序列中重复的次数。

    例如,序列 arr = [8,8,8,5,5] 可以被编码为 encoding =[3,8,2,5] 。encoding =[3,8,0,9,2,5] 和 encoding =[2,8,1,8,2,5] 也是 arr 有效的 RLE 。

给定一个游程长度的编码数组,设计一个迭代器来遍历它。

实现 RLEIterator 类:

    RLEIterator(int[] encoded) 用编码后的数组初始化对象。
    int next(int n) 以这种方式耗尽后 n 个元素并返回最后一个耗尽的元素。如果没有剩余的元素要耗尽,则返回 -1 。

示例 1:

输入:
["RLEIterator","next","next","next","next"]
[[[3,8,0,9,2,5]],[2],[1],[1],[2]]
输出:
[null,8,8,5,-1]
解释:
RLEIterator rLEIterator = new RLEIterator([3, 8, 0, 9, 2, 5]); // 这映射到序列 [8,8,8,5,5]。
rLEIterator.next(2); // 耗去序列的 2 个项,返回 8。现在剩下的序列是 [8, 5, 5]。
rLEIterator.next(1); // 耗去序列的 1 个项,返回 8。现在剩下的序列是 [5, 5]。
rLEIterator.next(1); // 耗去序列的 1 个项,返回 5。现在剩下的序列是 [5]。
rLEIterator.next(2); // 耗去序列的 2 个项,返回 -1。 这是由于第一个被耗去的项是 5,
但第二个项并不存在。由于最后一个要耗去的项不存在,我们返回 -1。

提示:

    2 <= encoding.length <= 1000
    encoding.length 为偶
    0 <= encoding[i] <= 109
    1 <= n <= 109
    每个测试用例调用next 不高于 1000 次

方法一:维护下一个元素的位置和删除次数

分析

在调用 next() 函数时,我们不会真正删除剩余的元素(或者说改变数组 A 的值),而是维护两个变量 i 和 q,其中 i 表示迭代器当前指向的是元素 A[i + 1],q 表示它已经被删除的次数,q 的值不会大于 A[i]。

例如,当数组 A 为 [1,2,3,4] 时,它表示的序列为 [2,4,4,4]。当 i 和 q 的值分别为 0 和 0 时,表示没有任何元素被删除;当 i 和 q 的值分别为 0 和 1 时,表示元素 A[0 + 1] = 2 被删除了 1 次;当 i 和 q 的值分别为 2 和 1 时,表示元素 A[2 + 1] = 4 被删除了 1 次,且之前的元素被全部删除。

算法

如果我们调用 next(n),即删除 n 个元素,那么对于当前的元素 A[i + 1],我们还可以删除的次数为 D = A[i] - q。

如果 n > D,那么我们会删除所有的 A[i + 1],并迭代到下一个元素,即 n -= D; i += 2; q = 0。

如果 n <= D,那么我们删除的最后一个元素就为 A[i + 1],即 q += D; return A[i + 1]。

class RLEIterator {
    int[] A;
    int i, q;

    public RLEIterator(int[] A) {
        this.A = A;
        i = q = 0;
    }

    public int next(int n) {
        while (i < A.length) {
            if (q + n > A[i]) {
                n -= A[i] - q;
                q = 0;
                i += 2;
            } else {
                q += n;
                return A[i+1];
            }
        }

        return -1;
    }
}



原网站

版权声明
本文为[毕业_设计]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_62396648/article/details/125417817