Weekly Contest 101的第一道題目,雖然分值才4分,可是倒是中等難度的題目RLE 迭代器:數組
編寫一個遍歷遊程編碼序列的迭代器。函數
迭代器由
RLEIterator(int[] A)
初始化,其中A
是某個序列的遊程編碼。更具體地,對於全部偶數i
,A[i]
告訴咱們在序列中重複非負整數值A[i + 1]
的次數。編碼迭代器支持一個函數:
next(int n)
,它耗盡接下來的n
個元素(n >= 1
)並返回以這種方式耗去的最後一個元素。若是沒有剩餘的元素可供耗盡,則next
返回-1
。指針例如,咱們以
A = [3,8,0,9,2,5]
開始,這是序列 [8,8,8,5,5] 的遊程編碼。這是由於該序列能夠讀做 「三個零,零個九,兩個五」。code示例:索引
輸入:["RLEIterator","next","next","next","next"], [[[3,8,0,9,2,5]],[2],[1],[1],[2]] 輸出:[null,8,8,5,-1] 解釋: RLEIterator 由 RLEIterator([3,8,0,9,2,5]) 初始化。 這映射到序列 [8,8,8,5,5]。 而後調用 RLEIterator.next 4次。 .next(2) 耗去序列的 2 個項,返回 8。如今剩下的序列是 [8, 5, 5]。 .next(1) 耗去序列的 1 個項,返回 8。如今剩下的序列是 [5, 5]。 .next(1) 耗去序列的 1 個項,返回 5。如今剩下的序列是 [5]。 .next(2) 耗去序列的 2 個項,返回 -1。 這是因爲第一個被耗去的項是 5, 但第二個項並不存在。因爲最後一個要耗去的項不存在,咱們返回 -1。PS:Leetcode此次的競賽時間是1小時45分鐘是由於競賽開始了10分鐘,可是題目仍是看不到element
其實一開始作這個題目的時候我也是一頭霧水,首先遊程編碼是一個我沒接觸過的概念,其次是這個題目描述說得太繞了。關於遊程編碼的概念,能夠從網上找到介紹。leetcode
我先從示例入手簡單講解一下題目:get
首先咱們要知道關於初始化的數組實際上是通過遊程編碼處理後的數組,即壓縮後的數組。先展現遊程編碼先後的數組:it
編碼後 [3,8,0,9,2,5] 編碼前 [8,8,8,5,5]
根據題目的介紹,對編碼後的數組進行處理後:[(3,8),(0,9),(2,5)]
。每一個括號內的其實就是(數字出現次數,對應的數字)
.也就是題目中所說的:
對於全部偶數i
,A[i]
告訴咱們在序列中重複非負整數值A[i + 1]
的次數。
而後咱們能夠嘗試進行解碼:
而題目實際上是要求咱們根據輸入的編碼後的數組遍歷解碼(編碼前)的數組
/** * RLE 迭代器 * @author RJH * create at 2018/9/9 */ public class RLEIterator { /** * 當前原數據的索引,能夠看作是一個指向當前訪問位置的指針 */ private int index=0; /** * 當前遍歷的元素,對應index+1的原數據的元素。實際上是對應遊程編碼解壓後的元素 */ private int element=-1; /** * 初始化的原數據,實際上是遊程編碼壓縮後的數組 */ private int[] data; public RLEIterator(int[] A) { data=A; } public int next(int n) { while (n>0){ if(index>data.length-2){ element=-1; break; } //當前元素出現次數 int times=data[index]; if(times>0){ if(times>n){ data[index]=times-n; element=data[index+1]; }else{ //表明對應的元素已經遍歷完了,因此設爲0 data[index]=0; //當前的元素則爲index+1的元素 element=data[index+1]; index+=2; } n-=times; }else{ //次數爲0,直接訪問下一個偶數index對應的次數 index+=2; } } return element; } }