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

相关文章

2390.从字符串中移除星号

给你一个包含若干星号 * 的字符串 s 。 在一步操作中,你可以: 选中 s 中的一个星号。 移除星号左侧最近的那个非星号字符,并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意: 生成的输入保证总是可以执行题面中描述的操作。 可以证明结果字符串是唯一的。 示例 1: 输入:s = “leet**cod*e” 输出:“lecoe” 解释:从左到右执行移除操作: 距离第 1 个

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

LeetCode--206 反转链表

题目 反转一个单链表。 示例 示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL class Solution {public:ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr){return head;}ListNo

剑指offer(C++)--翻转单词顺序列

题目 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? class S

剑指offer(C++)--左旋转字符串

题目 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! class Solution {public:string LeftRotateStri

PAT-1039 到底买不买(20)(字符串的使用)

题目描述 小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如,YrR8RrY是小红想做的珠串;那么ppRYYGrrYBR2258可以

js小题:通过字符串执行同名变量怎么做

在JavaScript中,你不能直接使用一个字符串来直接引用一个变量,因为JavaScript是一种静态类型语言(尽管它的类型在运行时可以变化),变量的名字在编译时就被确定了。但是,有几种方法可以实现类似的功能: 使用对象(或Map)来存储变量: 你可以使用一个对象来存储你的变量,然后使用字符串作为键来访问这些变量。 let myVars = { 'var1': 'Hello', 'var

linux匹配Nginx日志,某个字符开头和结尾的字符串

匹配 os=1 开头, &ip结尾的字符串 cat 2018-06-07.log | egrep -o ‘os=1.*.&ip’ 存入日志。然后使用submit 前面和后面的值去掉,剩下就是需要的字符串。 cat 2018-06-07.log | egrep -o ‘os=1.*.&ip’ >log.log

算法训练营第六十七天 | 卡码网110 字符串接龙、卡码网105 有向图的完全可达性、卡码网106 岛屿的周长

卡码网110 字符串接龙 这题一开始用的邻接表+dfs,不幸超时 #include <iostream>#include <list>#include <string>#include <vector>using namespace std;int minLen = 501;bool count(string a, string b) {int num = 0;for (int i

【JavaSE ⑧】P219 ~ 225 Date类‘’DateFormat类转化Date和字符串;Calendar类获得日历中某值,修改日历,日历转日期

目录 日期时间类1 Date类概述常用方法 2DateFormat类构造方法格式规则常用方法parse方法format方法 3 Calendar类概念获取方式常用方法get/set方法add方法getTime方法 ● 练习1.判断Date不同参数构造的输出2. 用日期时间相关的API,计算一个人已经出生了多少天。3. 获取Calendar对象,输出日历当前年,月,日4. 把日历转换为日期