奇妙数列

07/03/2021

leetcode-奇妙数列

题目描述

请你实现三个 API append,addAll 和 multAll 来实现奇妙序列。

请实现 Fancy 类 :

Fancy() 初始化一个空序列对象。
void append(val) 将整数 val 添加在序列末尾。
void addAll(inc) 将所有序列中的现有数值都增加 inc 。
void multAll(m) 将序列中的所有现有数值都乘以整数 m 。
int getIndex(idx) 得到下标为 idx 处的数值(下标从 0 开始),并将结果对 109 + 7 取余。如果下标大于等于序列的长度,请返回 -1 。

示例:

输入:
["Fancy", "append", "addAll", "append", "multAll", "getIndex", "addAll", "append", "multAll", "getIndex", "getIndex", "getIndex"]
[[], [2], [3], [7], [2], [0], [3], [10], [2], [0], [1], [2]]
输出:
[null, null, null, null, null, 10, null, null, null, 26, 34, 20]

解释:
Fancy fancy = new Fancy();
fancy.append(2); // 奇妙序列:[2]
fancy.addAll(3); // 奇妙序列:[2+3] -> [5]
fancy.append(7); // 奇妙序列:[5, 7]
fancy.multAll(2); // 奇妙序列:[52, 72] -> [10, 14]
fancy.getIndex(0); // 返回 10
fancy.addAll(3); // 奇妙序列:[10+3, 14+3] -> [13, 17]
fancy.append(10); // 奇妙序列:[13, 17, 10]
fancy.multAll(2); // 奇妙序列:[132, 172, 10*2] -> [26, 34, 20]
fancy.getIndex(0); // 返回 26
fancy.getIndex(1); // 返回 34
fancy.getIndex(2); // 返回 20

提示:

  • 1 <= val, inc, m <= 100
  • 0 <= idx <= 105
  • 总共最多会有 105 次对 append,addAll,multAll 和 getIndex 的调用。

本人题解

class Fancy {
    constructor() {
 
    }
    arr = [];
    oprs = [];
 
    append(val) {
        this.arr.push({i: this.oprs.length, val})
    }
 
    addAll(inc) {
        this.oprs.push({
            t: 'a',
            n: inc
        })
    }
    
    multAll(m) {
        this.oprs.push({
            t: 'm',
            n: m
        })
    }
 
    getIndex(idx) {
        if (idx >= this.arr.length) {
            return -1
        }
        let d = this.arr[idx]
        let i = d.i;
        if (i == this.oprs.length) {
            return d.val
        }
        for (; i < this.oprs.length; i++) {
            let o = this.oprs[i]
            switch (o.t) {
                case 'a':
                    d.val += o.n
                    break;
                case 'm':
                    d.val *= o.n
                    break
            }
            if (d.val >= 1000000007) {
                d.val = d.val % 1000000007
            }
        }
        d.i = i;
        return d.val
    }
}

分析

忘了。以后再补