【问题标题】:Comparing values between two arrays比较两个数组之间的值
【发布时间】:2017-08-18 16:47:01
【问题描述】:

我正在尝试设置一个函数来检查单词或文本是否为回文。为此,它拆分文本,以便每个字母都是新数组的一个元素,它消除了空格并创建了反向数组。 然后它检查两个数组中相同位置的每个元素是否相等。如果不是,则返回 false,如果是,则返回 true。 这里的功能:

function palindrome(str) {
  var low = str.toLowerCase();
  var newArray = low.split("");
  var noSpace = newArray.filter(function(val) {
    return val !== " ";
  });
  var reverse = noSpace.reverse();
  
  function check (a, b) {
    console.log(`checking '${a}' against '${b}'`);
    var partial;
    var result = 1;
    for (var i = 0; i < a.length; i++) {
      console.log(`comparing '${a[i]}' and '${b[i]}'`);
      if (a[i] !== b[i]) {
        result = 0;
      } else {
        partial = 1;
        result *= partial;
      }
    }
    return result;
  }
  
  var result = check(noSpace, reverse);
  if (result == 1) {
    return true;
  } else {
    return false;
  }
  
   
}


palindrome("r y e");

我不知道出了什么问题,但无论我将什么单词或文本传递给函数,该函数似乎都会继续返回一个真值。这有什么问题?

【问题讨论】:

  • 您可能还想用您正在使用的语言名称进行标记。
  • 您可能希望正确缩进您的代码。要调试您的代码,请使用调试器逐行检查它,同时检查变量。
  • 仔细阅读reverse real 的文档。
  • let isPalindrome = str.replace(/\s/g, "") === str.replace(/\s/g, "").split("").reverse().join("");
  • “女士,我是亚当”怎么样?

标签: javascript arrays palindrome


【解决方案1】:

您的问题似乎是因为reverse() 也更改了实际数组。原来如此

var reverse = noSpace.reverse();

将反转noSpace 并在变量reverse 上分配对它的引用。也就是说,两个数组都是同一个(反转的)数组。

为了绕过它,我使用了原始数组的 .slice()create a copy,然后在新数组上调用了 .reverse(),从而消除了任何冲突。

这是它的外观的工作 sn-p:

function palindrome(str) {
    var str_array = str.toLowerCase().split("");
    var no_space = str_array.filter(function(val) {
        return val !== " ";
    });

    // By applying '.slice()', we create a new array
    // reference which can then be reversed and assigned
    // to the 'reverse' variable
    var reverse = no_space.slice().reverse();

    function check(a, b) {
        var partial;
        var result = 1;
        for(var i=0; i < a.length; i++) {
            if(a[i] !== b[i]) {
                // We don't need to keep
                // comparing the two, it
                // already failed
                return 0;
            } else {
                // I've kept this part even though
                // I don't really know what it is
                // intended for
                partial = 1;
                result *= partial;
            }
        }
        return result;
    }
    return check(no_space, reverse) === 1;
}

console.log(palindrome("a b a"));
console.log(palindrome("r y e"));

【讨论】:

  • 看起来 reverse() 是搞乱我的代码的那个。 slice() 似乎是一个很好的解决方案。我没有得到'return check(no_space, reverse) === 1;'在回文函数的末尾。你能解释一下吗?
  • check() 函数将返回一个值(0 或 1)。我们希望palindrome() 函数返回truefalse。为此,我们需要将check() 返回的值与 0 或 1(在本例中为 1)进行比较。所以如果check() 返回1,我们得到1 === 1(即true)。如果check() 返回0,我们得到0 === 1(即false)。因此,我们有 palindrome() 返回 truefalse 取决于 check() 函数的返回值
  • 或者,您可以使用if(check(no_space,reverse)===1) { return true; } else { return false; }。它们的工作方式完全相同,只是代码大小的问题
【解决方案2】:

你为回文编码的方式太复杂了。

但是您的代码存在一个问题:当您执行 reverse() 时,它也会更改原始数组。

因此,您需要确保通过slice() 复制它。

您也可以直接发送布尔结果,而不是发送10

【讨论】:

    【解决方案3】:

    result *= partial;1 * 1 将始终等于1

    【讨论】:

    • 但如果 result 之前由于不匹配而被设置为 0,它将保持为 0
    • @torazaburo 是的,你的意思是说.reverse() 是问题所在?为什么不发布答案?
    • 我希望 for 循环比较两个数组的所有值,所以我想我可以创建一个变量来存储所有比较的结果。 1 与布尔值 true 相同,所以我想我可以使用它。
    • @Dema 为什么不使用result = 1
    • 我想要一个变量来跟踪以前的比较。如果我只使用 result = 1 但在两个数组中的某个点,两个值不相同,则该函数无论如何都会返回 true,即使该单词不是回文。对吗?
    【解决方案4】:

    我没有更正您的代码,但这里有一个为您优化的解决方案。

    function palindrom(string) {
        var arr = string.split("");
    
        var lengthToCheck = Math.floor(arr.length / 2);
        for (var i = 0; i < lengthToCheck; i++) {
            if (arr[i] != arr[arr.length - (1 + i)]) {
                return false;
            }
        }
    
        return true;
    }
    

    首先,我在传递的字符串的每个字符之后拆分数组。之后我得到了数组长度的一半,因为它只检查一半就足够了。 使用 for 循环,我将前半部分与后半部分进行比较。一旦我发现两个不匹配的字符,我就会返回 false。如果整个前半部分与数组的后半部分匹配,则 for 循环将完成,然后返回 true。

    【讨论】:

    • 她/他没有要求新的实现。世界上有上百万个回文实现。他/她问为什么发布的代码不起作用。
    【解决方案5】:

    实际发生的是.reverse() 将一个数组反转,然后存储对该数组的引用,这不是您在check() 方法中调用的内容。

    简单的解决方法是更改​​您的 if 语句:

    if (a[i] !== b.reverse()[i])
    

    【讨论】:

    • 那不是每次迭代都会反转b 吗?
    • 它的工作是偶然的,而且效率很低,每次比较单个字符时都会重新反转数组。
    • @torazaburo 同意,超级低效和hacky。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多