0

0

Typescript 编码编年史:反转字符串中的单词

WBOY

WBOY

发布时间:2024-07-12 09:40:52

|

492人浏览过

|

来源于dev.to

转载

typescript 编码编年史:反转字符串中的单词

问题陈述:

给定一个输入字符串 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) 额外空间就地解决它,我们可以使用两指针技术来反转原始字符串中的单词。

Moshi Chat
Moshi Chat

法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。

下载

代码:

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 < right) {
            [arr[left], arr[right]] = [arr[right], arr[left]];
            left++;
            right--;
        }
    }

    // reverse the entire array of characters
    reverse(chars, 0, chars.length - 1);

    // reverse each word in the reversed array
    let start = 0;
    for (let end = 0; end <= chars.length; end++) {
        if (end === chars.length || chars[end] === ' ') {
            reverse(chars, start, end - 1);
            start = end + 1;
        }
    }

    // join the characters back into a string and split by spaces to remove extra spaces
    return chars.join('').split(/\s+/).join(' ');
}

时间复杂度分析:

  • 时间复杂度: 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 步。

结论:

  • 使用暴力方法和优化的就地方法可以有效地解决字符串中单词反转的问题。
  • 理解问题并将其分解为可管理的部分至关重要。
  • 使用清晰的逻辑并优化可读性可确保解决方案易于遵循。
  • 使用各种边缘情况进行测试可确保鲁棒性。
  • 识别问题的模式可以帮助将类似的解决方案应用于其他挑战。

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

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

216

2025.10.31

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

609

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

547

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

539

2024.04.29

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号