【问题标题】:Modifying index of a string修改字符串的索引
【发布时间】: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


【解决方案1】:

您可以使用 .replace("","") 函数。

例如:

let str = "hello world"; 
str = str.replace("hello", "this");
console.log(str); // this world

示例代码笔:https://codepen.io/darrow8/pen/VNjyJP

更多信息:https://www.w3schools.com/jsref/jsref_replace.asp

【讨论】:

  • 当然,但是如果你想在索引处替换,而不是基于子字符串。此外,替换肯定是 O(n) 时间,并且可能是 O(n) 空间。
  • 我认为不可能在 O(1) 时间内完成这种功能,因为您可以拥有越来越大的字符串,计算机必须对其进行排序
  • 为什么需要排序,这没有意义。在 C 中,这在 O(1) 时间内是微不足道的。访问是 O(1),因此设置是 O(1)
【解决方案2】:

你可以使用substring:

"use strict";
const replaceCharAt = (s, c, i) => i ? (i != 1 ? c + s.substring(i + 1) : s[0] + c + s.substring(3)) : c + s.substring(i);
let str = "hello world";
str = replaceCharAt(str, "n", 0);
str = replaceCharAt(str, "3", 1);
console.log(str);

【讨论】:

    【解决方案3】:

    在JavaScript 中,字符串是不可变的,所以您能做的最好的事情就是创建一个带有您需要的更改的新字符串(所以,忘记O(1)),这是我能想到的最好的现在正在使用string.replace()的替换功能:

    const replaceAt = (str, idx, char) =>
    {
        return str.replace(/./g, (match, offset) => offset === idx ? char : match);
    }
    
    console.log(replaceAt("Hello", 1, "3"));

    或者,String.slice():

    const replaceAt = (str, idx, char) =>
    {
        return str.slice(0, idx) + char + str.slice(idx + 1);
    }
    
    console.log(replaceAt("Hello", 1, "3"));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      相关资源
      最近更新 更多