【发布时间】:2019-08-27 23:41:54
【问题描述】:
我想知道替换字符串中的字符的运行时(在 javascript 中)。
例如
let str = "hello world";
str[0] = "n";
console.log(str); // hello world
在严格模式下,这会引发错误,因为您无法修改字符串(只读)。
你将如何在 js 中实现一个 O(1) 时间、O(1) 空间算法来做str[index] = char?在 C 中,这是微不足道的,因为访问是 O(1),您可以修改该元素,而无需分配新数组并复制值。
我找到了使用 split 来执行此操作的解决方案……但这不是矫枉过正吗?这意味着 O(n) 时间和空间。
因为我使用 javascript,所以想知道这个主要是为了面试问题
【问题讨论】:
-
这不是 O(n) 时间吗?由于 slice 返回一个浅拷贝,它可能至少是 O(1) 空间。
-
但是,如果我会做
str[5] = "w"或其他什么,它如何在不遍历的情况下达到 5?切片是 O(1) 操作吗?在 ECMA 脚本上,它看起来像 O(n):ecma-international.org/ecma-262/6.0/index.html -
@Iza 出于采访目的,可能没有人会期望您优化字符串操作的性能,因为这在浏览器环境中通常不是问题。参加 JS 面试并开始修改字符串以提高您演示的解决方案的性能可能是取消资格的好方法。如果你确实需要这样的东西,你可能会使用数组或 typedarrays 来表示单个字符。
-
这绝对是公平的。我只是觉得应该有办法做这些事情。当我编写 javascript 代码时,它使分析我的运行时变得更加困难,因为我遇到了这样的问题。所以目前,有没有办法做到这一点?我也不同意这会取消我的资格。我进行的每一次技术面试,都被要求分析或满足时间/空间要求。如果我在 for 循环中进行拆分或其他操作,我必须将我的算法设置为 O(n^2) 而不是 O(n),这应该是
-
@Iza 这样做的方法是将字符串表示为字符或字节数组(取决于您想要走多远),然后对数组进行变异。在正常情况下,您需要走的最远距离是
"n" + str.slice(1)。
标签: javascript string