首页 > 解决方案 > 数组在本地机器上是可迭代的,但在 Leetcode 上不行?

问题描述

我正在解决这个leetcode 问题(在电话号码中找到的字母组合),并且该解决方案似乎在我的机器上运行,在 vscode 中。这是我正在运行的代码,在“23”的示例输入下:

/**
 * @param {string} digits
 * @return {string[]}
 */
 var letterCombinations = function(digits) {

    mapping = [ //this used to be an object in form {2: ['a','b', 'c'] (and so on...)}, i changed it to this to see if it fixed anything but it didn't
        [], 
        [], 
        ['a', 'b', 'c'], 
        ['d', 'e', 'f'], 
        ['g', 'h', 'i'], 
        ['j', 'k', 'l'], 
        ['m', 'n', 'o'], 
        ['p', 'q', 'r', 's'], 
        ['t', 'u', 'v'], 
        ['w', 'x', 'y', 'z']
    ] 
     
    letter_combinations = [];

    for(let letter of mapping[digits[0]]){
        let prefix = letter;
        for(let suffix of mapping[digits.slice(1)]){
            letter_combinations.push([prefix + suffix]);
        }
    }
    return letter_combinations;
};

console.log(letterCombinations('23'));

在 VSCode/我的机器中,它似乎正在工作,因为这是输出:

[
  [ 'ad' ], [ 'ae' ],
  [ 'af' ], [ 'bd' ],
  [ 'be' ], [ 'bf' ],
  [ 'cd' ], [ 'ce' ],
  [ 'cf' ]
]

但是,在 Leetcode 中,我得到了这个错误:

Line 24 in solution.js
    for(let letter of mapping[digits[0]]){
                             ^
TypeError: mapping[digits[0]] is not iterable
    Line 24: Char 30 in solution.js (letterCombinations)
    Line 41: Char 19 in solution.js (Object.<anonymous>)
    Line 16: Char 8 in runner.js (Object.runner)
    Line 32: Char 26 in solution.js (Object.<anonymous>)
    Line 1251: Char 30 in loader.js (Module._compile)
    Line 1272: Char 10 in loader.js (Object.Module._extensions..js)
    Line 1100: Char 32 in loader.js (Module.load)
    Line 962: Char 14 in loader.js (Function.Module._load)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
    Line 17: Char 47 in run_main_module.js

这似乎告诉我'mapping [digits [0]''是不可迭代的。在 Leetcode 和 VSCode 中将 'mapping[digits[0]' 打印到控制台会返回一个 ['a', 'b', 'c'] 数组,它应该是可迭代的,对吧?

我认为解决此问题的一种方法是使用 for...in 循环或 for(var;cond;step) 循环,而不是 'letter',让它成为 'mapping[digits[0]][index ]',但是我相信这将是一个低效的解决方法?

所以我想知道如何直接遍历mapping[digits[0]],或者如果不可能,我为什么不能?

我感谢所有的帮助,如果我遗漏了一些非常明显的东西,请原谅我。

标签: javascriptarraysloopsdebugging

解决方案


您编写的解决方案仅在以下情况下有效digits.length === 2

在 Leetcode 和 VSCode 中将 'mapping[digits[0]' 打印到控制台会返回一个 ['a', 'b', 'c'] 数组,它应该是可迭代的,对吧?

如果数字是空字符串''怎么办?digits[0]将返回未定义

我认为解决此问题的一种方法是使用 for...in 循环或 for(var;cond;step) 循环,而不是 'letter',让它成为 'mapping[digits[0]][index ]',但是我相信这将是一个低效的解决方法?

切换到正常for循环或使用forEach不会改变迭代次数,因此与for...of循环相比它们并不是低效的

此外,mapping[digits.slice(1)]当数字的长度为 3 时不起作用,因为您的映射数组只有最大索引为9('123'.slice(1)返回 23 但mapping[23]未定义)的元素


推荐阅读