有没有更快的JavaScript反向字符串算法?

mwg9r5ms  于 2023-01-01  发布在  Java
关注(0)|答案(6)|浏览(114)

所以我在寻找最快的反转字符串函数。
这里是我的函数和所有的函数,我发现在互联网上和他们的perfromance测试:
https://jsperf.com/javascript-reversing-string-performance
看起来最快的一个(在我看来也是最漂亮的)是这样的:

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

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

lb3vh1jj

lb3vh1jj1#

除了内置的reverse函数之外,有几十种不同的方法可以实现这个功能,因为JavaScript没有这个函数。下面是我在JavaScript中解决字符串反转问题的三种最有趣的方法。
溶液1

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

console.time("function test");
reverseString('Hello') // => 0.250ms
console.timeEnd("function test");

解决方案二

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");

解决方案三

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('')
}
vfhzx4xs

vfhzx4xs2#

这个似乎更快:

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

f87krz0w3#

基于davaakhuu-erdenekhuu解决方案,我创建了一个基准测试,以便您测试哪种解决方案最适合您https://jsbench.me/4bkfflcm2z
我在MacBook Pro 16上的Firefox和Chrome上运行过,似乎第一个选项在Firefox上最快,第三个选项在Chrome上最快
希望对你有用

hl0ma9xz

hl0ma9xz4#

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

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

dojqjjoe

dojqjjoe5#

对于任何ArrayLike类型,最快的反转方式是逻辑上的,通过将其 Package 成一个反转的可迭代对象:

function reverse<T>(input: ArrayLike<T>): Iterable<T> {
    return {
        [Symbol.iterator](): Iterator<T> {
            let i = input.length;
            return {
                next(): IteratorResult<T> {
                    return i
                        ? {value: input[--i], done: false}
                        : {value: undefined, done: true};
                },
            };
        },
    };
}

现在,您可以反向迭代任何数组、字符串或缓冲区,而无需对反向数据进行任何额外的复制或处理:

for(const a of reverse([1, 2, 3])) {
    console.log(a); //=> 3 2 1
}

这是最快的方法,因为您不复制数据,也不做任何处理,您只是逻辑地反转它。

ukqbszuj

ukqbszuj6#

我在Firefox和Chrome中测试了我的方法,它是这里给出的方法中最快的方法。

function reverseString5(str) {
  let x = '';
  
  for (let i = str.length - 1; i >= 0; --i) {
        x += str[i];
  }
  
  return x;
}

所有测试均运行here

相关问题