【问题标题】:Writing palindrome function写回文函数
【发布时间】:2020-07-13 23:38:28
【问题描述】:

我是 java 脚本的初学者。我正在编写为回文字符串返回 true 或 false 的代码。我知道有很多方法可以编写代码来检查回文,但我想知道我的代码出了什么问题。请帮忙。

function palindrome(str) {

  if (str == "") {
    return false;
  } else {
    const palia = str.replace(/[\W_]/g, "").toLowerCase();
    const number = palia.length;
    console.log(number);
    var num1 = number / 2;
    num1 = Math.floor(num1);
    console.log(num1);

    for (var i = 1; i < num1; i++) {
      var b = number - i;
      b++;
      console.log(b);
      if (palia[i] == palia[b]) {
        console.log("Ture");
        return true;

      } else {
        console.log("false");
        alg = "false";
        return false;
      };
    };
  };

};

console.log(palindrome("eye"));

而且我知道我已经编写了冗长的代码。我很抱歉。我会学习其他的写作方法。但这会以 code=0 退出。在 for 循环。请帮忙。提前致谢。

【问题讨论】:

  • 我真的不明白你想要完成什么。如果你在学习的同时分析其他人的解决方案,直到你掌握了它(即使你是专家,仍然需要继续做)stackoverflow.com/questions/22111507/…

标签: javascript


【解决方案1】:

我已经评论了我在下面替换的行。

function palindrome(str) {

    if (str == ""){
        // Empty string is a palindrome
        // return false;
        return true;
    } else {
        const palia = str.replace(/[\W_]/g, "").toLowerCase();
        const number = palia.length;
        console.log(number);
        var num1 = number / 2;
        num1 = Math.floor(num1);
        console.log(num1);
    
        // Must compare from the first position
        //for (var i = 1; i < num1; i++){
        for (var i = 0; i <= num1; i++){
            var b = number - i;
            // Increment gives out of bound access
            //b++;
            b--;
            console.log(b);
    
            if (palia[i] == palia[b]){
                // Typo
                //console.log("Ture");
                console.log("True");
                return true;
    
            } else{
                console.log("false");
                alg = "false";
                return false;
                
            };
        };
    };         
};
    
palindrome("eye");

【讨论】:

    【解决方案2】:

    这段代码有很多问题

    • 循环中从 0 开始索引
    • 你只能迭代到半串
    • “”其实是回文

    【讨论】:

    • 只迭代到半串是正确的。您只需测试前半部分的所有元素是否与后半部分的相应元素匹配。
    【解决方案3】:

    在 "eye" 的情况下,for 循环根本不执行,因为 1 并不小,而是与 num1 的长度相同。

    【讨论】:

      【解决方案4】:

      您需要从索引0 开始循环,而不是1

      您不应该在找到匹配项后立即返回 true,因为以后可能会出现不匹配。相反,如果您在循环结束时没有发现不匹配,则返回 true。

      你对b的计算是错误的,应该是number - i - 1,而不是number - i + 1。例如,如果字符串的长度为 6,则必须将元素 0 与 5、1 与 4、2 与 3 进行比较。

      无需检查空字符串。这是一个回文,循环会正确检测到这一点(循环会立即停止,所以它会落到return true)。

      function palindrome(str) {
      
        const palia = str.replace(/[\W_]/g, "").toLowerCase();
        const number = palia.length;
        console.log(number);
        var num1 = number / 2;
        num1 = Math.floor(num1);
        console.log(num1);
      
        for (var i = 0; i < num1; i++) {
          var b = number - i - 1;
          console.log(b);
          if (palia[i] == palia[b]) {
            console.log("True");
          } else {
            console.log("False");
            return false;
          }
        }
        return true;
      };
      
      console.log(palindrome("eye"));
      console.log(palindrome("abcdefg"));
      console.log(palindrome("abcdeedcba"));

      【讨论】:

        【解决方案5】:

        应该是这样的:

        function palindrome(str, insensitive = true){
          let s = str.split(''), l = s.length, i = Math.floor(l/2), a = s.slice(0, i), b, r;
          if(l % 2 !== 0)i++;
          b = s.slice(i); b.reverse(); b = '^'+b.join('')+'$';
          r = insensitive ? new RegExp(b, 'i') : new RegExp(b);
          if(a.join('').match(r)){
            return true;
          }
          return false;
        }
        console.log(palindrome('eyes'));
        console.log(palindrome('eye'));
        console.log(palindrome('noon'));
        console.log(palindrome('none'));
        console.log(palindrome('Nun'));
        console.log(palindrome('Nun', false));

        【讨论】:

        • 感谢您的回复。但我是一个非常初学者。因此,理解您的代码对我来说很难。
        • 没有循环,所以我的代码应该更快。及时......你会学到的。
        猜你喜欢
        • 2015-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-09
        • 1970-01-01
        • 2019-12-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多