【问题标题】:JS palindrome check with "every" helper method breakdownJS回文检查与“每个”辅助方法故障
【发布时间】:2019-02-09 17:47:50
【问题描述】:

我试图理解为什么我的输入是falsy

> palindrome('abaasa')
false

鉴于此回文检查器功能

function palindrome(str) {
  return str.split('').every((char, i) => {
    return char === str[str.length - i - 1];
  });
}

据我了解,every 助手对从数组中获取的每个值进行布尔检查。

分解后它在我看来是这样的。

(0 => a) === (5 => a) // truthy <--- START
(1 => b) === (4 => s) // falsy
(2 => a) === (3 => a) // truthy

我知道有比必要更多的比较,我知道这需要优化。

继续迭代,这是指针相交的地方。

(3 => a) === (2 => a) // truthy
(4 => b) === (1 => s) // falsy
(5 => a) === (0 => a) // truthy <--- STOP 

问题

every 方法是否足够聪明,可以在找到 虚假比较?

如果不是,我的函数如何确定 falsy 返回?

【问题讨论】:

  • every() 在第一个返回 false 的比较时停止迭代。但是,当字符串回文时,您将花费两倍的时间进行检查。
  • every 方法是否足够聪明,可以在发现虚假比较时返回 false?是的,是的!
  • @PatrickRoberts 我认为如果every()false 比较中停止迭代,那么最好的情况是log(n),它实际上不需要花费两倍的时间

标签: javascript algorithm ecmascript-6 palindrome


【解决方案1】:

您可以通过在 every 函数中引入 console.log 语句来检查它是否足够智能。这将使您实际上看到它停止的位置。

function palindrome(str) {
  return str.split('').every((char, i) => {
    console.log(i);
    return char === str[str.length - i - 1];
  });
}

let str = 'abaasa';
console.log(palindrome(str)); // prints: 0 1 false

every 方法是否足够聪明,可以在发现虚假比较时返回 false?

如您所见,足够聪明,可以在虚假之后停下来。只有当它总共可以达到 5 时,它才经过索引 0 和 1

【讨论】:

    【解决方案2】:

    every() 函数用于对数组中的每个元素进行布尔检查。

    如果你有:

    const array = [0, 10, 14];

    问题是您想知道该数组中的每个值是否都大于 5。

    您可以编写一些如下所示的代码:

    array.every((val) =&gt; val &gt; 5);

    我们将获取数组,对其调用every() 函数并传入一个函数来调用数组中的每个元素。所以我传入val 并检查是否0 大于5 会返回false。

    every() 函数运行时,它会检查每个函数运行的 return 值,如果任何函数返回 false 那么整个表达式也会返回 false,但是如果它对每个函数都返回 true元素,整个函数表达式返回true。

    所以它返回一个数组中每个元素的比较。

    请记住,通过使用 every() 数组帮助器来解决回文,您所做的工作量是原来的两倍。这是一个解决方案,但它做的工作量是需要做的两倍。

    所以你的返回错误的原因是因为每个角色都不是另一边角色的镜像。

    你在这里说的是:

    return char === str[str.length - i - 1];

    返回第一个元素和数组另一侧的镜像元素之间的比较。

    [abaasa]
    
    a === a // true
    b === s // false
    a === a // true
    

    那里有一个假,所以它不是回文。

    它是一个回文:

    [abaaba]
    
    a === a // true
    b === b // true
    a === a // true
    

    【讨论】:

      【解决方案3】:

      .every()

      正在检查每个条件是否为真(y)。如果其中任何一个被评估为假,那么它将返回假。这就是doc 所说的关于它的回归:

      如果回调函数为每个数组返回一个真值,则为真 元素;否则为假。

      【讨论】:

        猜你喜欢
        • 2012-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 2014-08-28
        • 2014-02-21
        相关资源
        最近更新 更多