为啥我的代码没有执行正确的答案/回文检查器 javascript

Posted

技术标签:

【中文标题】为啥我的代码没有执行正确的答案/回文检查器 javascript【英文标题】:why my code doesn't execute right answers / palindrome checker javascript为什么我的代码没有执行正确的答案/回文检查器 javascript 【发布时间】:2018-08-07 16:07:44 【问题描述】:

function palindrome(word) 
  var s = new Stack();
  for (var i = 0; i < word.length; i++) 
    s.push(word[i]);
  
  var rword = "";
  while (s.length() > 0) 
    rword += s.pop();
  
  if (word == rword) 
    return true;
   else 
    return false;
  


console.log(palindrome('test1'))
console.log(palindrome('manam'))

/* 我正在尝试使用堆栈检查单词是否为回文。但是当我运行我的代码时,它总是返回 false ,即使 word 是回文*/

【问题讨论】:

Stack 是如何定义的?那不是内置的 javascript 类型,那么它是从哪里来的呢?如果您更改为不带括号的var s = []s.length,您的代码将按原样运行。 【参考方案1】:

使用数组作为堆栈。此代码有效:

function palindrome(word) 
  var s = [];
  for (var i = 0; i < word.length; i++) 
    s.push(word[i]);
  
  var rword = "";
  while (s.length > 0) 
    rword += s.pop();
  
  if (word == rword) 
    return true;
   else 
    return false;
  


console.log(palindrome('manam'))

demo 注意:您还在代码中使用了 length() 而不是 length

【讨论】:

【参考方案2】:

我添加了一个简单的 Stack 实现,然后 function=palindrome 应该可以按预期工作。

我添加了一个函数 = palindrome1,它是回文判断的简单优化(仅循环一半长度的字符串)。

function Stack()

 this.stac=new Array();
 this.pop=function()
  return this.stac.pop();
 ;
 this.push=function(item)
  this.stac.push(item);
 ;
 this.length=function()
  return this.stac.length;
 ;

function palindrome(word)
    var s = new Stack();
    for (var i=0; i<word.length; i++)
        s.push(word[i]);
    
    var rword = "";
    while (s.length() > 0)
        rword+=s.pop();
    
    if (word == rword)
        return true;
    else
        return false;
    


console.log(palindrome('test1'))
console.log(palindrome('manam'))

function palindrome1(word)
   var maxIndex = word ? word.length:0;
   if(!maxIndex || maxIndex==0) 
    return false;
   
   var index = 0;
   var left = "";
   var right = "";
   while(index<(maxIndex/2)) 
    left += word[index];
    right += word[maxIndex-index-1];
    index++;
   
   return left==right;

console.log(palindrome1('test1'))
console.log(palindrome1('manam'))

【讨论】:

代码是次要的,第一优先的应该是算法。在编码之前尝试优化算法。 感谢您的建议。我正在做一些在线课程,现在我开始阅读 JS 数据结构和算法书籍,希望它能帮助我理解和编写更好的代码......希望......【参考方案3】:

除了已经提到的内容之外,您还可以将回文检查器简化为更小的函数 (es6+)。由于回文数等于它自己的反转,我们可以检查它(我们可以使用内置方法进行反转,而不是自己使用堆栈实现它)。

const palindrome = str => str === str.split("").reverse().join("");

console.log(palindrome("racecar"))
console.log(palindrome("palindrome"))

【讨论】:

这是比我的更优雅的解决方案。内置功能的美丽用法。 在 ES6 中你可以使用扩展运算符将字符串的每个字符放入一个数组中,所以str =&gt; str === [...str].reverse().join('')

以上是关于为啥我的代码没有执行正确的答案/回文检查器 javascript的主要内容,如果未能解决你的问题,请参考以下文章

为啥 jumpForce 在检查器中自动更改?

使回文检查器保持字符串索引超出范围错误的一半,如何解决?

整数数组回文检查器

回文字符串问题:为啥我必须放 +1 而不是 -1 才能使这段代码工作?

为啥我的代码会执行双重转场?

为啥我的页面无法在 Internet Explorer 中正确显示?