4-字符串-41-反转字符串中的单词-LeetCode151

2024-06-20 12:12

本文主要是介绍4-字符串-41-反转字符串中的单词-LeetCode151,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4-字符串-41-反转字符串中的单词-LeetCode151

参考:代码随想录

LeetCode: 题目序号151

PS:如果需要在线上做这道题需要将对应的代码类名和输入输出带上。

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

CSDN: CodeZeng1998

其他平台:CodeZeng1998好锅

151. 反转字符串中的单词

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

**注意:**输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

提示:

  • 1 <= s.length <= 104
  • s 包含英文大小写字母、数字和空格 ' '
  • s至少存在一个 单词

**进阶:**如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。

步骤:

  • 去掉不必要的空格字符
  • 整个字符串反转
  • 针对单个单词反转
    /*** 反转字符串中的单词** @param s 待 反转的字符串* @return 反转后的字符串* @author CodeZeng1998*/public String reverseWords(String s) {// 1.去除首尾以及中间多余空格StringBuilder sb = removeSpace(s);// 2.反转整个字符串reverseString(sb, 0, sb.length() - 1);// 3.反转各个单词reverseEachWord(sb);return sb.toString();}/*** 反转各个单词** @param sb 待处理的字符串* @author CodeZeng1998*/private void reverseEachWord(StringBuilder sb) {int left = 0;int right = sb.length() - 1;while (left <= right) {int slowIndex = left;int fastIndex = left;while (fastIndex < sb.length() && sb.charAt(fastIndex) != ' ') {fastIndex++;}if (slowIndex != fastIndex) {reverseString(sb, slowIndex, fastIndex - 1);left = fastIndex;} else {left++;}}}/*** 反转字符串(双指针)** @param sb 待处理的字符串* @author CodeZeng1998*/public void reverseString(StringBuilder sb, int start, int end) {int left = start;int right = end;while (left <= right) {char tempChar = sb.charAt(right);sb.setCharAt(right, sb.charAt(left));sb.setCharAt(left, tempChar);left++;right--;}}/*** 按要求移除字符串的空格(双指针)** @param s 待处理的字符串* @return 返回按要求移除字符串的空格后的字符串* @author CodeZeng1998*/private StringBuilder removeSpace(String s) {StringBuilder noSpaceStringBuilder = new StringBuilder();int left = 0;int right = s.length() - 1;// 移除首空格while (s.charAt(left) == ' ') {left++;}// 移除尾空格while (s.charAt(right) == ' ') {right--;}while (left <= right) {if (s.charAt(left) != ' ') {noSpaceStringBuilder.append(s.charAt(left));} else if (s.charAt(left) == ' ' && noSpaceStringBuilder.charAt(noSpaceStringBuilder.length() - 1) != ' ') {noSpaceStringBuilder.append(s.charAt(left));}left++;}return noSpaceStringBuilder;}

ChatGPT:

这段代码实现了一个字符串反转的功能,具体是对字符串中的每个单词进行反转,并且去除首尾以及中间多余的空格。最终返回处理后的字符串。

1. reverseWords 方法:

去除空格:

  • 首先,调用 removeSpace 方法去除字符串 s 首尾以及中间多余的空格,得到一个 StringBuilder 对象 sb

反转整个字符串:

  • 调用 reverseString 方法,反转整个 sb 字符串。

反转各个单词:

  • 最后,调用 reverseEachWord 方法,对 sb 字符串中的每个单词进行反转。

返回结果:

  • 返回反转处理后的字符串。

2. reverseEachWord 方法:

初始化指针:

  • 初始化两个指针 leftright,分别指向字符串的起始位置和末尾位置。

循环处理字符串:

  • 使用 while 循环,当 left 小于或等于 right 时,继续循环。

定位单词边界:

  • 使用两个指针 slowIndexfastIndex,从 left 开始定位单词的边界。fastIndex 用于查找空格,slowIndex 指向单词的起始位置。

反转单词:

  • 如果找到了单词的边界(即 slowIndex 不等于 fastIndex),调用 reverseString 方法反转单词,然后将 left 更新为 fastIndex。否则,将 left 自增,继续查找下一个单词。

3. reverseString 方法:

初始化指针:

  • 初始化两个指针 leftright,分别指向需要反转的子字符串的起始位置 start 和结束位置 end

交换字符:

  • 使用 while 循环,当 left 小于或等于 right 时,交换 leftright 指针对应的字符,并移动指针,直到整个子字符串被反转。

4. removeSpace 方法:

初始化:

  • 创建一个 StringBuilder 对象 noSpaceStringBuilder,用于存储去除空格后的字符串。

移除首尾空格:

  • 使用 while 循环移除字符串 s 的首尾空格。left 从字符串起始位置开始向右移动,直到找到第一个非空字符;right 从字符串末尾位置开始向左移动,直到找到最后一个非空字符。

移除中间多余空格:

  • 使用 while 循环从 leftright 遍历字符串 s。如果当前字符不是空格,则将其添加到 noSpaceStringBuilder 中;如果当前字符是空格且 noSpaceStringBuilder 的最后一个字符不是空格,则将空格添加到 noSpaceStringBuilder 中。这一步确保了中间不会有多余的空格。

返回结果:

  • 返回去除多余空格后的 StringBuilder 对象 noSpaceStringBuilder

示例过程

假设输入字符串为 " the sky is blue "

  1. 调用 removeSpace
    • 去除首尾空格后得到 "the sky is blue"
    • 去除中间多余空格后得到 "the sky is blue"
  2. 调用 reverseString
    • 反转整个字符串后得到 "eulb si yks eht"
  3. 调用 reverseEachWord
    • 反转每个单词后得到 "blue is sky the"
  4. 返回结果:
    • 最终返回 "blue is sky the"

通过以上步骤,输入字符串 " the sky is blue " 被处理为 "blue is sky the"

151. Reverse Words in a String

Given an input string s, reverse the order of the words.

A word is defined as a sequence of non-space characters. The words in s will be separated by at least one space.

Return a string of the words in reverse order concatenated by a single space.

Note that s may contain leading or trailing spaces or multiple spaces between two words. The returned string should only have a single space separating the words. Do not include any extra spaces.

Example 1:

Input: s = "the sky is blue"
Output: "blue is sky the"

Example 2:

Input: s = "  hello world  "
Output: "world hello"
Explanation: Your reversed string should not contain leading or trailing spaces.

Example 3:

Input: s = "a good   example"
Output: "example good a"
Explanation: You need to reduce multiple spaces between two words to a single space in the reversed string.

Constraints:

  • 1 <= s.length <= 104
  • s contains English letters (upper-case and lower-case), digits, and spaces ' '.
  • There is at least one word in s.

Follow-up: If the string data type is mutable in your language, can you solve it in-place with O(1) extra space?

在这里插入图片描述

上图是由 Pic 生成

关键词:ONE PIECE,Dragon Ball AND HUNTERxHUNTER

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

CSDN: CodeZeng1998

其他平台:CodeZeng1998好锅

这篇关于4-字符串-41-反转字符串中的单词-LeetCode151的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1078101

相关文章

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但