【问题标题】: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,您的代码将按原样运行。

标签: javascript stack palindrome


【解决方案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('')
    猜你喜欢
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 2015-09-14
    • 2015-10-17
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多