对while array[]和while array.length的迭代感到困惑



所以我正在研究这个leet代码问题。

这是解决方案

var levelOrder = function(root) {
let q = [root], ans = []

while (q[0]) {
let qlen = q.length;
let row = [];
for (let i = 0; i < qlen; i++) {
let curr = q.shift()
row.push(curr.val)
if (curr.left) q.push(curr.left)
if (curr.right) q.push(curr.right)
}
ans.push(row)            
}
return ans
};

然而,我对while循环感到困惑。为什么当它是while (q[0]) {时它会起作用而当我使用while (q.length) {

时则不是这几乎是一样的,不是吗?有人能帮我理解吗?由于

while(q[0])检查发生的情况是,作者通过调用q.shift()确保数组不是空的,因为在每次迭代中都删除了一个项目。array .prototype.shift()从数组中移除最左边的元素,是一个可变方法。

知道每个元素不是空的更实用,因为输入可以是数组的数组,否则,您将不得不遍历每个元素并计算其长度。

有人在leet上回答了这个问题,我把它转发给其他人,这样其他人就可以受益了

因为根可能为空,在这种情况下,我们应该跳过while循环,继续返回ans,即使q.length = 1。

或者,我们可以在while循环之前插入if (!root) return[]行(类似于c++或Java解决方案),或者将q定义更改为q = root ?[root]:[](类似于Python的解决方案)。

感谢gallivan

最新更新