【问题标题】:Is there a faster Reverse String Algorithm for JavaScript?JavaScript 是否有更快的反向字符串算法?
【发布时间】:2018-06-18 21:04:27
【问题描述】:

所以我正在寻找最快的反向字符串函数。

这是我的函数以及我在互联网上找到的所有函数及其性能测试:

https://jsperf.com/javascript-reversing-string-performance

看起来最快的(也是我认为最漂亮的)是这样的:

function reverseString(str) {
  return str.split().reverse().join("");
}

但也许有更有效、更快的方法来做到这一点?

【问题讨论】:

  • 用 C 或 WebAssembly 编写绑定。
  • 看起来是这样,但无论写作多么优雅,就我的经验而言,这是最慢的一个。

标签: javascript algorithm performance


【解决方案1】:

这个似乎更快:

function reverseString(str) {
  let reversed = "";
  const l = str.length;
  for(let i = l-1; i >= 0; i--) {
    reversed = `${reversed}${str[i]}`;
  }
  return reversed;
}

【讨论】:

    【解决方案2】:

    可能有数十种不同的方法可以做到这一点,不包括内置的 reverse 函数,因为 JavaScript 没有。 下面是我在 JavaScript 中解决字符串反转问题的三个最有趣的方法。

    解决方案 1

    function reverseString (str) {
      return str.split('').reverse().join('')
    }
    
    console.time("function test");
    reverseString('Hello') // => 0.250ms
    console.timeEnd("function test");
    

    解决方案 2

    function reverseString (str) {
      let reversed = '';
      for (const character of str) {
        reversed = character + reversed
      }
      return reversed
    }
    console.time("function test");
    reverseString('Hello') // => 0.166ms
    console.timeEnd("function test");
    

    解决方案 3

    function reverseString (str) {
      return str.split('').reduce((reversed, character) => character + reversed, '')
    }
    console.time("function test");
    reverseString('Hello') // => 0.133ms
    console.timeEnd("function test");
    

    在 ES6 中,您还有一个选择

    function reverseString (str) {
      return [...str].reverse().join('')
    }
    

    【讨论】:

    • 嗯,您的第三个解决方案看起来比第一个更快,谢谢!
    • 别指望它!这些结果仅适用于 1 次测试和 1 个单词。而且你不知道他/她的代理人当时在做什么。说真的,我什至无法理解为什么这个答案被接受了,因为它甚至没有开始回答 OP 的问题,即理论上哪种方式更快,而不是经验上如此糟糕的测试。
    【解决方案3】:

    基于davaakhuu-erdenekhuu 解决方案,我创建了一个基准测试,以便您测试哪个最适合您 https://jsbench.me/4bkfflcm2z

    我已经在 Macbook pro 16 上的 Firefox 和 Chrome 上运行它 似乎第一个选项在Firefox 上最快,第三个选项在Chrome 上最快

    希望对你有用

    【讨论】:

    • 我在其中添加了 Max/Norman 更简单的“向后循环和连接”方法,它比 Davaakhuu 回答中的任何方法都快得多
    【解决方案4】:
    function reverseString(str) {
        let reversed = ""
        for (let i = str.length -1; i >= 0; i--){
            reversed = reversed + str[i]
        }
        return reversed;
    }
    

    从输入字符串的末尾开始工作是最佳的,尤其是取决于您如何组合字符。请记住,当您通过在开头插入(或删除)元素来修改数组时,必须调整所有其他元素的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-25
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 2020-08-09
      • 2020-07-16
      相关资源
      最近更新 更多