【问题标题】:javascript reverse a substring inside a string optimallyjavascript最佳地反转字符串中的子字符串
【发布时间】:2023-02-01 14:12:53
【问题描述】:

我有一个场景,我需要反转字符串中的子字符串。 Javascript 字符串是不可变的,传统的字符串交换技术在这里不起作用。所以我决定使用string.split('')string.join('')方法来获得解决方案。请检查下面的代码。

function reverseAString(str, startIndex, endIndex) {
  let left = startIndex;
  let right = endIndex;
  let output = str;
  while(left < right) {
    const arr = output.split('');
    let temp = arr[left]
    arr[left] = arr[right]
    arr[right] = temp;
    output = arr.join('');
    left += 1;
    right -= 1;
  }
  return output
}

这按预期工作。但是有没有更好的方法来反转子串,因为上述解决方案不是实现反转的最佳方法?

【问题讨论】:

  • javascript 有一个reverse 方法可以为您完成。
  • 嗨@Layhout。感谢您及时的回复。我的问题不是数组,而是字符串中的子字符串。例如,让我们以字符串“hello world!”为例。我的方案是反转子字符串“hello”。所以输出应该像“olleh world!”。我在问题中发布的解决方案适用于该场景。但这不是最优的。
  • 好吧,反转字符串的最佳方法是将其拆分为一个数组,将其反转并将其连接回去。或者另一种不太理想的方法是声明一个新的字符串变量,创建一个反向循环并在子字符串上调用 charAt 方法以连接到新的字符串变量。
  • 是的,@Layhout。就我而言,我正在做同样的事情,但多次进行字符串拆分。但是对于您的解决方案,仅将字符串拆分一次就足够了。同意。

标签: javascript string reverse


【解决方案1】:

这是你的功能,但要简化。我们可以将调用字符串方法链接到数组方法中。 Array.prototype.reverse() 用于反转数组,Array.prototype.join() 用于将数组中的所有元素连接成一个字符串。 String.prototype.substring() 用于从原始字符串中剪切字符串,但不会更改/更改原始字符串。

function reverseASubstring(str, startIndex, endIndex) {
    let reversedStr = str.substring(startIndex, endIndex).split("").reverse().join("");
    return str.substring(0, startIndex) + reversedStr + str.substring(endIndex);
}

console.log(reverseASubstring("Tony is Tony in reverse.", 0, 4));

【讨论】:

  • 与我提出的解决方案相比,它是一个干净且最佳的解决方案。它肯定会减少一些循环。 +1。
【解决方案2】:

该解决方案构建了一个具有两个捕获组的正则表达式,一个用于要跳过的字符数(例如起始索引),另一个用于要反转的字符数。有了这个,您可以应用单个正则表达式替换,使用 .split('').reverse().join('') 反转第二个捕获组

function reverseASubstring(str, start, end) {
    let regex = new RegExp('^(.{' + start + '})(.{' + (end - start + 1) + '})');
    return str.replace(regex, (m, c1, c2) => c1 + c2.split('').reverse().join(''));
}

let str = 'Hello world.';
console.log(str, 0, 4, '=>', reverseASubstring(str, 0, 4));
console.log(str, 6, 10, '=>', reverseASubstring(str, 6, 10));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2020-07-27
    • 2016-01-06
    • 2017-11-23
    • 2016-04-21
    • 2017-01-21
    • 1970-01-01
    相关资源
    最近更新 更多