Typescript 编码年史:反转字符串中的单词-js教程

首页 2024-07-12 10:52:02

问题陈述:

给定输入字符串 s,逆转单词的顺序。单词被定义为非空格字符的序列。 s 中间的单词至少会被一个空格分开。返回单个空格按相反顺序连接的单词字符串。

注意 s 可能包括前导或跟随空间或两个单词之间的多个空间。返回的字符串应该只有一个空间来分隔单词。不要包含任何额外的空间。

示例1:
  • 输入:s =“天是蓝色的”
  • 输出:“蓝色是天空”
示例2:
  • 输入:s =“你好世界”
  • 输出:“世界你好”
  • 注:您的反转字符串不应包含前导或跟随空间。
示例3:
  • 输入:s =“很好的例子”
  • 输出:“例子很好”
  • 注:您需要将两个单词之间的多个空间减少到反转字符串中的单个空间。
限制条件:
  • 1
  • s 包括英文字母(大小写)、数字和空格 ' '.
  • s中至少有一个单词
初步思考过程:

要解决这个问题,我们需要:

  1. 将字符串分成单词。
  2. 颠倒单词的顺序。
  3. 将单词重新连接在一起,每个单词之间都有一个空间。
基本解决方案: 代码:
function reversewordsbruteforce(s: string): string {
    // split the string by spaces and filter out empty strings
    let words = s.trim().split(/\s /);

    // reverse the array of words
    words.reverse();

    // join the words with a single space
    return words.join(' ');
}
时间复杂度分析:
  • 时间复杂: o(n),n是字符串的长度。分裂、反转和合并都需要线性时间。
  • 空间复杂度: o(n),n是字符串的长度。我们将单词存储在数组中,并将最终结果存储在字符串中。
限制:

考虑到限制,这个解决方案是有效的。然而,它为单词数组使用了额外的空间。

优化方案:

如果字符串数据类型是可变的,我们需要使用它 o(1) 在现场解决它的额外空间,我们可以使用两个指针技术来反转原始字符串中的单词。

代码:
function reversewordsoptimized(s: string): string {
    // trim the string and convert it to an array of characters
    let chars = s.trim().split('');

    // helper function to reverse a portion of the array in place
    function reverse(arr: string[], left: number, right: number) {
        while (left 



<h3>
  
  
  时间复杂度分析:
</h3>

  • 时间复杂: o(n),n是字符串的长度。每个字符都会被固定次数处理。
  • 空间复杂度: o(1)因为我们在当地修改数组,只使用恒定量的额外空间。
改进基本解决方案:
  • 通过对字符数组进行本地操作,优化解决方案可以降低空间复杂性。
边缘条件及测试: 边缘情况:
  1. 字符串包括前导空格和尾随空格。
  2. 字符串中的单词之间有多个空间。
  3. 字符串只包含一个单词。
  4. 字符串的长度达到最小或最大限度。
测试用例:
console.log(reverseWordsBruteForce("the sky is blue")); // "blue is sky the"
console.log(reverseWordsBruteForce("  hello world  ")); // "world hello"
console.log(reverseWordsBruteForce("a good   example")); // "example good a"
console.log(reverseWordsBruteForce("singleWord")); // "singleWord"
console.log(reverseWordsBruteForce("   ")); // ""

console.log(reverseWordsOptimized("the sky is blue")); // "blue is sky the"
console.log(reverseWordsOptimized("  hello world  ")); // "world hello"
console.log(reverseWordsOptimized("a good   example")); // "example good a"
console.log(reverseWordsOptimized("singleWord")); // "singleWord"
console.log(reverseWordsOptimized("   ")); // ""
一般解决问题的策略:
  1. 理解问题:仔细阅读问题陈述,了解要求和约束。
  2. 识别关键操作: 确定所需的关键操作,如拆分、反转和连接单词。
  3. 优化可读性: 使用清晰简洁的逻辑,确保代码易于理解。
  4. 彻底测试: 使用各种情况(包括边缘情况)来测试解决方案,以确保正确性。
识别类似问题:
  1. 字符串操作:

    • 需要根据具体情况修改字符串的问题
    • 例子:颠倒句子中每个单词的字符顺序。
  2. 双指针技术:

    • 使用两个指针有助于优化解决方案的问题。
    • 例子:从排序数组中删除重复项。
  3. 就地算法:

    • 需要在有限的额外空间内操作的问题
    • 示例:向右旋转数组 k 步。
结论:
  • 使用暴力和优化的本地方法可以有效地解决字符串中单词反转的问题。
  • 了解问题并将其分解为可管理的部分是非常重要的。
  • 使用清晰的逻辑和优化可读性可以确保解决方案易于遵循。
  • 使用各种边缘条件进行测试可以保证鲁棒性。
  • 识别问题的模式有助于在其他挑战中应用类似的解决方案。

通过练习这些问题和策略,可以提高解决问题的能力,为各种编码挑战做好更好的准备。

以上是Typescriptt 编码年史:反转字符串中单词的详细内容,请关注其他相关文章!


p