• leetcode 341. Flatten Nested List Iterator


    本题的难点是,这不是一个双重数组,数组里面是一个NestedInteger类,它有isInteger, getInteger, getList等方法。因此很容易被示例中的 [[1,1],2,[1,1]]所误导。

     class NestedIterator {
          constructor(nestedList) {
            this.s = nestedList
          }
          next() {
            var el = this.s.shift()
            return el.getInteger()
          }
    
          hasNext() {
    
            var s = this.s
            while (s.length) {
              var temp = s[0]
              if (temp.isInteger()) {
                return true;
              }
              s.shift();
              //如果temp为一个数组
              for (var i = temp.getList().length - 1; i >= 0; i--) {
                s.unshift(temp.getList()[i]);
              }
            }
            return false;
          }
        }
    

    如果传参真的是一个 [[1,1],2,[1,1]]数组又如何呢,并且它支持如下两种遍历。

    //遍历1
        var i = new NestedIterator([[1, 2, 2.5], [], 3, [4, 5]]), a = [];
    
        do {
          var val = i.next();
          if (typeof val == 'number') {
            a.push(val)
          } else {
            break
          }
        } while (true)
    
    
        console.log(a)
    

    ======

    //遍历2
        var i = new NestedIterator([[1, 2, 2.5], [], 3, [4, 5]]), a = [];
        while (i.hasNext()) a.push(i.next());
        console.log(a)
    

    这时我们需要引进一个变量,让它无论如何 都走一下hasNext方法

    
        class NestedIterator {
          constructor(list) {
            this.s = list
            this._hasCallHasNext = false;
          }
          next() {
            if (!this._hasCallHasNext) {
              this.hasNext()
            }
            var el = this.s.shift()
            this._hasCallHasNext = false;
            return el
          }
    
          hasNext() {
    
            var s = this.s
            while (s.length) {
              var temp = s[0]
              if (typeof temp === 'number') {
                this._hasCallHasNext = true;
                return true;
              }
              s.shift();
              //如果temp为一个数组
              for (var i = temp.length - 1; i >= 0; i--) {
                s.unshift(temp[i]);
              }
            }
            return false;
          }
        }
    

    但这会改变数组的结构,更普适的方案是添加两个游标:

     class NestedIterator {
          constructor(list) {
            this.s = list
            this.I = 0;
            this.J = 0;
            this._hasCallHasNext = false;
          }
          next() {
            if (!this._hasCallHasNext) {
              this.hasNext()
            }
            var list = this.s[this.I], val
            if (Array.isArray(list)) {
              val = list[this.J]
              this.J++;
            } else {
              val = list;
              this.I++
              this.J = 0;
            }
            this._hasCallHasNext = false
            return val
          }
          hasNext() {
            var s = this.s;
            for (var i = this.I; i < s.length; i++) {
              var temp = s[i]
              if (typeof temp === 'number') {
                this.I = i
                this._hasCallHasNext = true;
                return true;
              }
              if (this.J > temp.length) {
                this.J = 0;
              }
              for (var j = this.J; j < temp.length; j++) {
                var el = temp[j]
                if (typeof el === 'number') {
                  this.J = j
                  this._hasCallHasNext = true;
                  return true;
                }
              }
            }
            return false
          }
        }
    
    
  • 相关阅读:
    64位平台支持大于2 GB大小的数组
    NET Framework 4.5新特性 数据库的连接加密保护。
    永无止境之网站的伸缩性架构
    ASP.NET MVC IOC 之Ninject攻略
    C# 中几个小“陷阱”
    AngularJS的依赖注入方式
    JVM内存配置详解(转)
    StringBuilder、StringBuffer和String三者的联系和区别(转)
    Java线程的生命周期(转)
    Java程序员须知的七个日志管理工具(转)
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/12088878.html
Copyright © 2020-2023  润新知