【JS】二维矩阵中的`引用传递`的小坑

136 阅读2分钟

哈哈,我又来了,这次又碰到一个引用传递的坑。话不多说,上代码。

const findWords = (board, words) => {
    const m = board.length, n = board[0].length;
    const maxLen = words.reduce((prev, cur) => Math.max(prev, cur.length), 0);
    let flagBoard = new Array(m * n).fill(false);   //不能用矩阵,只能一维数组,不然报错,为什么?

    const insert = (i, j, dep, node) => {
        /* console.log(flagBoard); */
        if(dep == 0) return;
        if(i < 0 || j < 0 || i >= m || j >= n) return;
        if(flagBoard[i * n + j]) return;
        console.log(flagBoard);
        flagBoard[i * n + j] = true;
        console.log(flagBoard);
        const c = board[i][j];
        node = node[c] = node[c] || {};

        insert(i + 1, j, dep - 1, node);
        insert(i - 1, j, dep - 1, node);
        insert(i, j + 1, dep - 1, node);
        insert(i, j - 1, dep - 1, node);

        flagBoard[i * n + j] = false;
    };
    const buildTrie = () => {
        let root = {};
        for(let i = 0; i < m; i++){
            for(let j = 0; j < n; j++){
                insert(i, j, maxLen, root);
            }
        }
        return root;
    };  //板子的插入不同于之前的words,需要DFS插入所有情况

    let trie = buildTrie();

    const search = (word) => {
        let node = trie;

        for(const c of word){
            if(!node[c]) return false;
            node = node[c];
        }

        return true;
    };

    return words.filter(word => search(word));
};

该代码是LC-212的题解,注意看代码中的有一行注释:不能用矩阵,只能一维数组,不然报错,为什么?

说的啥意思呢,就是你不能写new Array(m).fill(new Array(n).fill(false));

哈哈,应该有很多朋友喜欢偷懒这样写矩阵吧?

那么你是否知道这种写法会有一个小问题呢?

我本来也不知道,是在debug半天后才发现问题所在,最后改成一维数组,利用index = i * n + j这种写法逻辑上表达矩阵位置,这样才AC了题目。

我直接把代码的问题拿一个例子说明:

let a = new Array(4).fill(new Array(4).fill(false));

let b = a[0];

console.log(a, b);

b[0] = true;

console.log(a, b);

打印结果:

捕获2.PNG

我靠,什么情况,我看这个代码,a是个4*4的矩阵,b是a的第一行,那么b[0] = true;的话,应该就第一行是[ true, false, false, false ]这种啊,怎么每行都变这样了啊。

哼哼,这就是问题所在,你在写new Array(m).fill(new Array(n).fill(false));的时候很爽吧,可是第一个fill的括号中的东西可都是引用到同一个实际物理对象噢,所以你改一行,所有行全会变,懂了吧。

image.png