【问题标题】:Why is this for loop reverting to 0 and never getting to the end of the size of this array为什么这个for循环恢复为0并且永远不会到达这个数组大小的末尾
【发布时间】:2021-02-17 11:21:16
【问题描述】:

这个问题是指这里的hackerank anagram问题:

由于某种原因,这个 for 循环永远不会完成。它达到 3(从它迭代的数组的长度为 -2),然后又回到 0,我不知道为什么。

const dictionary = ['hack', 'a' , 'rank' , 'khac','ackh']
const query = ['a','nark','bs','hack','stair']

console.log(stringAnagram(dictionary, query))

function stringAnagram(dictionary, query){
    let sortedDictionary=[];
    let sortedQuery = [];
    let alphabetisedWord;
    let sortedWord;
    let anagramsCount = [];
    // sort them
    for(let i = 0; i<dictionary.length-1; i++){
        sortedWord= dictionary[i];
        if(dictionary[i].length > 1){
         sortedWord= sortedWord.split('');
        console.log('sortedWord: ',sortedWord)
            sortedWord= sortedWord.sort();
            console.log('sortedWord: ',sortedWord)
            sortedWord= sortedWord.join('');
            console.log('sortedWord: ',sortedWord)

            sortedDictionary[i] = sortedWord;
        } else {
            sortedDictionary[i] = sortedWord;
        }
        console.log(i, dictionary.length)
    }
    
    for(let i = 0; i<query.length-1; i++){
        alphabetisedWord = query[i];
        if(query[i].length > 1){

        
        alphabetisedWord = alphabetisedWord.split('');
        console.log('alpha : ', alphabetisedWord)
        alphabetisedWord = alphabetisedWord.sort();
        alphabetisedWord = alphabetisedWord.join('');
        }

        var regex = new RegExp("/" + alphabetisedWord + "/", "g");
        console.log(stringAnagram(dictionary, query))
        anagramsCount[i] = sortedDictionary.toString().match(regex).length
        sortedQuery[i] = alphabetisedWord;
    }
    
    
    return anagramsCount;

}

谁能说出这是什么原因?我已经尝试记录所有索引和单词,但我之前用类似的回答方法做了一个类似的问题 - 只是这一次出现了无限循环,我以前从未见过这种情况。

【问题讨论】:

  • 当您使用RegExp 构造函数构造正则表达式字符串时,您不会将/ 添加到它。如果这样做,则意味着您要按字面意思匹配“/”字符。
  • 另外,console.log(stringAnagram(dictionary, query)) 是对函数的递归调用,这实际上是一个无限循环。
  • { "message": "Uncaught TypeError: Cannot read property 'length' of null", "filename": "https://stacksnippets.net/js", "lineno": 54, "colno": 68 } 修复上面的两个 cmets 时 - 行是 anagramsCount[i] = sortedDictionary.toString().match(regex).length - 还有为什么 -1i&lt;query.length-1 中?
  • 呵呵...有趣..然后去潜水
  • 内部无条件调用stringAnagram()stringAnagram()是一个无限递归序列。

标签: javascript


【解决方案1】:

如果一个简单的问题看起来不可能,那是你做错了……也可以自言自语

const dictionary = ['hack', 'a' , 'rank' , 'khac','ackh']
const query = ['a','nark','bs','hack','stair']

console.log(stringAnagram(dictionary, query))

function stringAnagram(dd,qq){
  var j=(x)=>{return JSON.parse(JSON.stringify(x))} //function to ensure an object isn't passed as pointer JUST IN CASE and to that dude critisizing this part, stringifying an already correctly evaluated obj works(therefore parsing that would be parsing a correctly stringified obj)
  var d=j(dd); var q=j(qq)
  //make words in both query and dictionary now have their words in only 1 format(so that indexOf would work like a charm)
  d=d.map(a=>{return a.split``.sort().join``})
  q=q.map(a=>{return a.split``.sort().join``})
  //now onto indexOf logic(returns the FIRST find of what ur looking for in an array)
  var arr=[]
  q.forEach(a=>{
    var i=0
    while(d.indexOf(a)!=-1){
      var y=d.indexOf(a)
      i++;d.splice(y,1)
    }
    arr.push(i)
  })
  return(arr)
}

【讨论】:

  • 你应该用letconst或其他东西声明j
  • 我从其中一件事上拼接起来。现在 javascript 有一种很好的方式将对象作为指针而不是副本传递,对于 2
  • 你没有声明j 根本;你创建了一个全局变量。
  • 不声明变量被普遍认为是糟糕的做法。我的意思是,你用函数中的所有其他变量来做。
  • 您好,@TheBombSquad 请阅读code of conduct。此外,cmets 不用于扩展讨论,请将此对话移至聊天。
猜你喜欢
  • 2021-08-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 2019-12-21
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
相关资源
最近更新 更多