跳到主要内容

33 篇博文 含有标签「树」

查看所有标签

· 阅读需 2 分钟

1、题干

给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。

提醒一下, 二叉搜索树 满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

 

示例 1:

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

输入:root = [0,null,1]
输出:[1,null,1]

 

提示:

  • 树中的节点数在 [1, 100] 范围内。
  • 0 <= Node.val <= 100
  • 树中的所有值均 不重复 。

 

注意:该题目与 538: https://leetcode-cn.com/problems/convert-bst-to-greater-tree/  相同

2、思路

根据题意使用DFS模拟,需要注意:

  • 对左子节点求和,需要将父节点求和结果、右子树节点之和、自身数值3者累加
  • 对右子节点求和,需要将右边祖先节点求和结果、右子树节点之和、自身数值3者累加

3、代码

function bstToGst(root: TreeNode | null): TreeNode | null {
return dfs(root), root;
}

function dfs(root?: TreeNode, pSum = 0): number {
if (!root) return 0;

const val = root.val;
const rSum = dfs(root.right, pSum);
root.val = val + pSum + rSum;
const lSum = dfs(root.left, root.val);

return val + rSum + lSum;
}

· 阅读需 2 分钟

1、题干

给定两个整数数组 inorderpostorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

 

示例 1:

输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]

示例 2:

输入:inorder = [-1], postorder = [-1]
输出:[-1]

 

提示:

  • 1 <= inorder.length <= 3000
  • postorder.length == inorder.length
  • -3000 <= inorder[i], postorder[i] <= 3000
  • inorder 和 postorder 都由 不同 的值组成
  • postorder 中每一个值都在 inorder 中
  • inorder 保证是树的中序遍历
  • postorder 保证是树的后序遍历

2、思路

后序遍历数组最后一个元素是根节点,中序遍历数组中根节点前、后两边分别是左子树与右子树,根据这两个性质递归即可,时间复杂度最优 O(nlogn)O(n\log{n}),最差 O(n2)O(n^2)

3、代码

function buildTree(inorder: number[], postorder: number[]): TreeNode | null {
if (!inorder.length) return null;

const rv = postorder.at(-1);
const root = new TreeNode(rv);

const c = inorder.indexOf(rv);

const inLeft = inorder.slice(0, c);
const inRight = inorder.slice(c + 1);

const postLeft = postorder.slice(0, c);
const postRight = postorder.slice(c, postorder.length - 1);

root.left = buildTree(inLeft, postLeft);
root.right = buildTree(inRight, postRight);

return root;
}

· 阅读需 2 分钟

1、题干

给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

 

示例 1:

输入:p = [1,2,3], q = [1,2,3]
输出:true

示例 2:

输入:p = [1,2], q = [1,null,2]
输出:false

示例 3:

输入:p = [1,2,1], q = [1,1,2]
输出:false

 

提示:

  • 两棵树上的节点数目都在范围 [0, 100]
  • -104 <= Node.val <= 104

2、思路

DFS 判断两棵树当前节点值是否相等,左右子树是否相等

3、代码

function isSameTree(p: TreeNode | null, q: TreeNode | null): boolean {
if (p && q) return p.val === q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);

return !p && !q;
};

· 阅读需 2 分钟

1、题干

给定一个二叉树:

struct Node {
int val;
Node *left;
Node *right;
Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL

初始状态下,所有 next 指针都被设置为 NULL

 

示例 1:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),'#' 表示每层的末尾。

示例 2:

输入:root = []
输出:[]

 

提示:

  • 树中的节点数在范围 [0, 6000]
  • -100 <= Node.val <= 100

进阶:

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序的隐式栈空间不计入额外空间复杂度。

    2、思路

    BFS模拟,每一层的节点用一个队列存储,队列中节点的 next 指向下一个节点即可。

    这题没有 Rust 编码环境。。

    3、代码

    function connect(root: Node | null): Node | null {
    let queue: Node[] = root ? [root] : [];

    while (queue.length) {
    const nextQueue = [];
    for (let i = 0; i < queue.length; i++) {
    queue[i].next = queue[i + 1];
    if (queue[i].left) nextQueue.push(queue[i].left);
    if (queue[i].right) nextQueue.push(queue[i].right);
    }
    queue = nextQueue;
    }

    return root;
    };

    · 阅读需 2 分钟

    1、题干

    给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。

    (如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)

     

    示例 1:

    输入:root = [8,3,10,1,6,null,14,null,null,4,7,13]
    输出:7
    解释:
    我们有大量的节点与其祖先的差值,其中一些如下:
    |8 - 3| = 5
    |3 - 7| = 4
    |8 - 1| = 7
    |10 - 13| = 3
    在所有可能的差值中,最大值 7 由 |8 - 1| = 7 得出。

    示例 2:

    输入:root = [1,null,2,null,0,3]
    输出:3

     

    提示:

    • 树中的节点数在 2 到 5000 之间。
    • 0 <= Node.val <= 105

    2、思路

    递归求子孙节点的最小值与最大值,分别求最大值最小值与当前节点值的差的绝对值,比较得出最大差值。

    3、代码

    function maxAncestorDiff(root: TreeNode | null): number {
    let ans = -Infinity;

    function dfs(node: TreeNode) {
    if (!node) return [Infinity, -Infinity];
    if (!node.left && !node.right) return [node.val, node.val];

    const r1 = dfs(node.left);
    const r2 = dfs(node.right);

    const min = Math.min(r1[0], r2[0]);
    const max = Math.max(r1[1], r2[1]);

    ans = Math.max(ans, Math.abs(node.val - min), Math.abs(node.val - max));

    return [Math.min(min, node.val), Math.max(max, node.val)];
    }

    return dfs(root), ans;
    };

    4、复杂度

    • 时间复杂度:O(n)O(n)
    • 空间复杂度:O(n)O(n)

    5、执行结果

    image.png

    · 阅读需 3 分钟

    1、题干

    给你一棵 完整二叉树 的根,这棵树有以下特征:

    • 叶子节点 要么值为 0 要么值为 1 ,其中 0 表示 False ,1 表示 True 。
    • 非叶子节点 要么值为 2 要么值为 3 ,其中 2 表示逻辑或 OR3 表示逻辑与 AND 。

    计算 一个节点的值方式如下:

    • 如果节点是个叶子节点,那么节点的  为它本身,即 True 或者 False 。
    • 否则,计算 两个孩子的节点值,然后将该节点的运算符对两个孩子值进行 运算 。

    返回根节点 root 的布尔运算值。

    完整二叉树 是每个节点有 0 个或者 2 个孩子的二叉树。

    叶子节点 是没有孩子的节点。

     

    示例 1:

    输入:root = [2,1,3,null,null,0,1]
    输出:true
    解释:上图展示了计算过程。
    AND 与运算节点的值为 False AND True = False 。
    OR 运算节点的值为 True OR False = True 。
    根节点的值为 True ,所以我们返回 true 。

    示例 2:

    输入:root = [0]
    输出:false
    解释:根节点是叶子节点,且值为 false,所以我们返回 false 。

     

    提示:

    • 树中节点数目在 [1, 1000] 之间。
    • 0 <= Node.val <= 3
    • 每个节点的孩子数为 0 或 2 。
    • 叶子节点的值为 0 或 1 。
    • 非叶子节点的值为 2 或 3

    2、思路

    使用 DFS 模拟

    3、代码

    function evaluateTree(root: TreeNode | null): boolean {
    if (!root || (!root.left && !root.right)) return !!root?.val;

    const l = evaluateTree(root.left);
    const r = evaluateTree(root.right);

    return root.val === 2 ? (l || r) : (l && r);
    };

    4、复杂度

    • 时间复杂度:O(n)O(n)
    • 空间复杂度:O(n)O(n)

    5、执行结果

    image.png

    · 阅读需 4 分钟

    1、题干

    有两位极客玩家参与了一场「二叉树着色」的游戏。游戏中,给出二叉树的根节点 root,树上总共有 n 个节点,且 n 为奇数,其中每个节点上的值从 1 到 n 各不相同。

    最开始时:

    • 「一号」玩家从 [1, n] 中取一个值 x1 <= x <= n);
    • 「二号」玩家也从 [1, n] 中取一个值 y1 <= y <= n)且 y != x

    「一号」玩家给值为 x 的节点染上红色,而「二号」玩家给值为 y 的节点染上蓝色。

    之后两位玩家轮流进行操作,「一号」玩家先手。每一回合,玩家选择一个被他染过色的节点,将所选节点一个 未着色 的邻节点(即左右子节点、或父节点)进行染色(「一号」玩家染红色,「二号」玩家染蓝色)。

    如果(且仅在此种情况下)当前玩家无法找到这样的节点来染色时,其回合就会被跳过。

    若两个玩家都没有可以染色的节点时,游戏结束。着色节点最多的那位玩家获得胜利 ✌️。

    现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true ;若无法获胜,就请返回 false

     

    示例 1 :

    输入:root = [1,2,3,4,5,6,7,8,9,10,11], n = 11, x = 3
    输出:true
    解释:第二个玩家可以选择值为 2 的节点。

    示例 2 :

    输入:root = [1,2,3], n = 3, x = 1
    输出:false

     

    提示:

    • 树中节点数目为 n
    • 1 <= x <= n <= 100
    • n 是奇数
    • 1 <= Node.val <= n
    • 树中所有值 互不相同

    还好不是博弈论

    2、思路

    DFS 求出整棵树的节点总数 c 和节点 x 的左右子树的节点总数 clcr,继而可以求得 x 子树之外的节点总数 c - cl - cr - 1,3者中的最大值如果超过节点总数的一半 c/2,则必定存在必胜值 y

    3、代码

    function btreeGameWinningMove(root: TreeNode | null, n: number, x: number): boolean {
    let cl = 0, cr = 0;

    function dfs(node: TreeNode) {
    if (!node) return 0;

    const c1 = dfs(node.left);
    const c2 = dfs(node.right);

    if (node.val === x) cl = c1, cr = c2;

    return c1 + c2 + 1;
    }

    const c = dfs(root);

    return Math.max(c - cl - cr - 1, cl, cr) > c / 2;
    };

    4、复杂度

    • 时间复杂度:O(n)O(n)
    • 空间复杂度:O(1)O(1)

    5、执行结果

    image.png

    · 阅读需 7 分钟

    1、题干

    给你一个 n * n 矩阵 grid ,矩阵由若干 01 组成。请你用四叉树表示该矩阵 grid

    你需要返回能表示矩阵 grid 的 四叉树 的根结点。

    四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:

    • val:储存叶子结点所代表的区域的值。1 对应 True,0 对应 False。注意,当 isLeafFalse 时,你可以把 True 或者 False 赋值给节点,两种值都会被判题机制 接受
    • isLeaf: 当这个节点是一个叶子结点时为 True,如果它有 4 个子节点则为 False
    class Node {
    public boolean val;
        public boolean isLeaf;
        public Node topLeft;
        public Node topRight;
        public Node bottomLeft;
        public Node bottomRight;
    }

    我们可以按以下步骤为二维区域构建四叉树:

    1. 如果当前网格的值相同(即,全为 0 或者全为 1),将 isLeaf 设为 True ,将 val 设为网格相应的值,并将四个子节点都设为 Null 然后停止。
    2. 如果当前网格的值不同,将 isLeaf 设为 False, 将 val 设为任意值,然后如下图所示,将当前网格划分为四个子网格。
    3. 使用适当的子网格递归每个子节点。

    如果你想了解更多关于四叉树的内容,可以参考 wiki

    四叉树格式:

    你不需要阅读本节来解决这个问题。只有当你想了解输出格式时才会这样做。输出为使用层序遍历后四叉树的序列化形式,其中 null 表示路径终止符,其下面不存在节点。

    它与二叉树的序列化非常相似。唯一的区别是节点以列表形式表示 [isLeaf, val]

    如果 isLeaf 或者 val 的值为 True ,则表示它在列表 [isLeaf, val] 中的值为 1 ;如果 isLeaf 或者 val 的值为 False ,则表示值为 0

     

    示例 1:

    输入:grid = [[0,1],[1,0]]
    输出:[[0,1],[1,0],[1,1],[1,1],[1,0]]
    解释:此示例的解释如下:
    请注意,在下面四叉树的图示中,0 表示 false,1 表示 True 。

    示例 2:

    输入:grid = [[1,1,1,1,0,0,0,0],[1,1,1,1,0,0,0,0],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,0,0,0,0],[1,1,1,1,0,0,0,0],[1,1,1,1,0,0,0,0],[1,1,1,1,0,0,0,0]]
    输出:[[0,1],[1,1],[0,1],[1,1],[1,0],null,null,null,null,[1,0],[1,0],[1,1],[1,1]]
    解释:网格中的所有值都不相同。我们将网格划分为四个子网格。
    topLeft,bottomLeft 和 bottomRight 均具有相同的值。
    topRight 具有不同的值,因此我们将其再分为 4 个子网格,这样每个子网格都具有相同的值。
    解释如下图所示:

     

    提示:

    1. n == grid.length == grid[i].length
    2. n == 2x 其中 0 <= x <= 6

    2、解题思路

    日常吐槽翻译,题目看了老半天


    题目意思是要把 nnn * n 矩阵分割成 44 等份(左上、右上、左下、右下);分割之后返回一个 NodeNode 初始化要确定 33 个值:valisLeafchildren44 个子节点);如果 Node 不是叶子节点就接着递归分割它的 44 个子节点对应的子矩阵。

    • children:可以先递归求出 44 个子节点,当前节点是否有子节点由 isLeaf 决定
    • val:所有子节点的 val 之和除以 44 并向上取整(也可以向下取整)
    • isLeaf:所有子节点的 val 之和是 4400,且所有子节点都是叶子节点

    矩阵大小是nn(n=2x,0<=x<=6)n * n(n = 2 ^ x, 0 <= x <= 6),矩阵最小是 111*1 最大是 646464*64,因此除最小矩阵外所有矩阵都可以被 44 等分,没有其他特殊情况需要处理


    3、代码

    var construct = function (grid) {
    const n = grid.length;

    function dfs(i0, i1, j0, j1) {
    if (i0 === i1 && j0 === j1) return new Node(grid[i0][j0], true);

    // 递归求出4个子节点
    const mi = Math.floor(i1 / 2 + i0 / 2), mj = Math.floor(j1 / 2 + j0 / 2);
    const tl = dfs(i0, mi, j0, mj);
    const tr = dfs(i0, mi, mj + 1, j1);
    const bl = dfs(mi + 1, i1, j0, mj);
    const br = dfs(mi + 1, i1, mj + 1, j1);

    const children = [tl, tr, bl, br];
    // 求出所有子节点的 val 之和
    const val = children.reduce((a, c) => a + c.val, 0);
    // isLeaf:所有子节点的 val 之和是 4 或 0,且所有子节点都是叶子节点
    const isLeaf = (val % 4 === 0) && children.every((n) => n.isLeaf);

    // node.val:所有子节点的 val 之和除以 4 并向上取整
    // node.isLeaf:所有子节点的 val 之和是 4 或 0,且所有子节点都是叶子节点
    // 4个子节点:当前节点是否有子节点由 isLeaf 决定
    return new Node(Math.ceil(val / 4), isLeaf, ...(isLeaf ? [] : children));
    }

    return dfs(0, n - 1, 0, n - 1);
    };

    4、执行结果

    image.png

    · 阅读需 5 分钟

    1、题干

    给你一个数组 pairs ,其中 pairs[i] = [xi, yi] ,并且满足:

    • pairs 中没有重复元素
    • xi < yi

    令 ways 为满足下面条件的有根树的方案数:

    • 树所包含的所有节点值都在 pairs 中。
    • 一个数对 [xi, yi] 出现在 pairs 中 当且仅当 xi 是 yi 的祖先或者 yi 是 xi 的祖先。
    • 注意:构造出来的树不一定是二叉树。

    两棵树被视为不同的方案当存在至少一个节点在两棵树中有不同的父节点。

    请你返回:

    • 如果 ways == 0 ,返回 0 。
    • 如果 ways == 1 ,返回 1 。
    • 如果 ways > 1 ,返回 2 。

    一棵 有根树 指的是只有一个根节点的树,所有边都是从根往外的方向。

    我们称从根到一个节点路径上的任意一个节点(除去节点本身)都是该节点的 祖先 。根节点没有祖先。

     

    示例 1:

    输入:pairs = [[1,2],[2,3]]
    输出:1
    解释:如上图所示,有且只有一个符合规定的有根树。

    示例 2:

    输入:pairs = [[1,2],[2,3],[1,3]]
    输出:2
    解释:有多个符合规定的有根树,其中三个如上图所示。

    示例 3:

    输入:pairs = [[1,2],[2,3],[2,4],[1,5]]
    输出:0
    解释:没有符合规定的有根树。

     

    提示:

    • 1 <= pairs.length <= 105
    • 1 <= xi < yi <= 500
    • pairs 中的元素互不相同。

    尽力了,磨了大半天,只想出这么个方法。思路还算清晰,但无法证明解法的正确性,能AC纯粹靠运气。。。


    2、解题思路

    • 先排除 ways = 0 不存在根节点的情况
    • 再排除 ways = 0 存在互为祖先节点的情况
      • 如果任意两个节点 ab 不存在祖孙关系,但二者祖孙链上有共同的节点 c,则 cab 的共同祖先
      • 若后续能推出 abc 的祖先,则说明存在矛盾无法构建树
    • 再排除 ways = 2 的情况:节点存在祖孙关系,且祖孙链长度相同
      • 补充:任意父节点只有1个子节点都会造成这种情况,此时父子节点可以互换位置构成多棵树
    • 剩余情况 ways = 1
      • 补充:所有父节点都有2个以上子节点才能保证唯一

    3、代码

    var checkWays = function (pairs) {
    const linkDict = [];
    const add = (i, j) => {
    if (!linkDict[i]) linkDict[i] = new Set();
    linkDict[i].add(j);
    };
    for (const [i, j] of pairs) add(i, j), add(j, i);
    const keys = linkDict.map((v, i) => i).filter((v) => v > -1);
    keys.sort((a, b) => linkDict[b].size - linkDict[a].size);

    // 排除 ways = 0: 不存在根节点
    if (linkDict[keys[0]].size !== keys.length - 1) return 0;

    // 排除 ways = 0: 存在互为祖先的节点
    const ancestorDict = keys.reduce((a, c) => (a[c] = new Set(), a), []);
    for (let i = 1; i < keys.length; i++) {
    for (let j = i + 1; j < keys.length; j++) {
    if (linkDict[keys[i]].has(keys[j])) continue;
    for (const li of linkDict[keys[i]]) {
    if (li === keys[0] || !linkDict[keys[j]].has(li)) continue;
    if (ancestorDict[keys[i]].has(li) || ancestorDict[keys[j]].has(li)) return 0;
    ancestorDict[li].add(keys[i]), ancestorDict[li].add(keys[j]);
    }
    }
    }

    // 排除 ways = 2: 节点存在祖孙关系,且祖孙链长度相同
    for (const [i, j] of pairs) if (linkDict[i].size === linkDict[j].size) return 2;

    return 1;
    };

    4、复杂度

    • 时间复杂度:O(n3)O(n^3),其中 nn 为节点数
    • 空间复杂度:O(n2)O(n^2)

    5、执行结果

    image.png

    · 阅读需 4 分钟

    1、题干

    设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

    请实现 KthLargest 类:

    • KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
    • int add(int val)val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

     

    示例:

    输入:
    ["KthLargest", "add", "add", "add", "add", "add"]
    [[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
    输出:
    [null, 4, 5, 5, 8, 8]

    解释:
    KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
    kthLargest.add(3); // return 4
    kthLargest.add(5); // return 5
    kthLargest.add(10); // return 5
    kthLargest.add(9); // return 8
    kthLargest.add(4); // return 8

     

    提示:

    • 1 <= k <= 104
    • 0 <= nums.length <= 104
    • -104 <= nums[i] <= 104
    • -104 <= val <= 104
    • 最多调用 add 方法 104
    • 题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素

     

    注意:本题与主站 703 题相同: https://leetcode-cn.com/problems/kth-largest-element-in-a-stream/

    2、解法1-优先队列

    使用优先队列解题,初始化时把所有元素加入到最小优先队列pq中,添加元素时直接把元素加入pq,若pq元素个数小于k则直接返回-1,若pq元素个数超过k则逐一移除最后返回队头元素。


    3、代码

    var KthLargest = function (k, nums) {
    this.k = k;
    this.pq = new MinPriorityQueue({ compare: (a, b) => a - b });
    for (const n of nums) this.pq.enqueue(n);
    };

    KthLargest.prototype.add = function (val) {
    this.pq.enqueue(val);
    if (this.pq.size() < this.k) return -1;
    while (this.pq.size() > this.k) this.pq.dequeue();
    return this.pq.front();
    };

    4、复杂度

    • 时间复杂度:O(nlogn)O(nlogn)
    • 空间复杂度:O(n)O(n)

    5、执行结果

    执行用时: 132 ms 内存消耗: 46.6 MB


    6、解法2-计数排序

    对数据流使用计数排序,首次确定第 k 大元素 kIdx 需要遍历所有元素;此后添加数据需要再确定第 k 大元素时,如果添加的数据比 kIdx 小则直接返回 kIdx ;如果添加的数据比 kIdx 小则从下标 kIdx 开始在容器 list 找到更大且元素值不为0的下标返回即可。


    这个题目中使用该算法坑略多,只作参考,不建议使用。


    7、复杂度

    • 时间复杂度:O(n)O(n)
    • 空间复杂度:O(n)O(n)

    8、代码

    var KthLargest = function (k, nums) {
    this.k = k;
    this.size = nums.length;
    this.kIdx = -1;
    this.list = new Array(2e4 + 1).fill(0);
    for (const n of nums) this.list[n + 1e4]++;
    };

    KthLargest.prototype.add = function (val) {
    (val += 1e4), this.list[val]++, this.size++;
    if (this.size < this.k) return -1;

    if (this.kIdx < 0) {
    for (let i = this.list.length - 1, k = this.k; i >= 0; i--) {
    if (k < this.list[i]) this.list[i] = k;
    if ((k -= this.list[i]) <= 0) {
    this.kIdx = i;
    break;
    }
    }
    return this.kIdx - 1e4;
    }

    if (this.size > this.k && val >= this.kIdx) {
    this.list[this.kIdx]--;
    for (let i = this.kIdx; i < this.list.length; i++) {
    if (this.list[i]) {
    this.kIdx = i;
    break;
    }
    }
    }

    return this.kIdx - 1e4;
    };

    9、执行结果

    1.png