题目:

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

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

示例 2:

输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

进阶:

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

解题思路:

首先把字符串左右两边多余的空格给去掉,然后用两个指针分别从两段开始向中间扫描,将扫描到的左、右两个单词进行交换。这交换过程中注意下标的变换,因为两个单词长度不一定相等。

代码:

 class Solution {
public:
string reverseWords(string s) {
string temp;
int l1,l2,r1,r2;
l1=,r2=s.size()-;
// 第一步:先把字符串两边的空格给去掉
while(l1 <= r2) { //1、这里取等于 可以处理 s=" " 这种特殊情况,即输出""
if(s[l1] == ' '){
s.erase(l1,);
r2--; //2、这里是r2改变,而不是l1,l1实际不需要改变
}
else
break; }
while(l1 < r2 ) {
if(s[r2] == ' '){
s.erase(r2,);
r2--;
}
else
break;
}
// 第二步:尺取左、右两个单词长度,然后交换两个单词,不断重复这个过程
while(l1 < r2)
{
temp.clear();
for(r1=l1; r1<r2 && s[r1+] != ' '; ++r1); //3、找到两个单词边界
for(l2=r2; l2>l1 && s[l2-] != ' '; --l2);
if(r1 >= l2) //4、若只剩一个单词,则不必处理,直接退出
break;
int len1=r1-l1+;
int len2=r2-l2+;
temp = s.substr(l1, len1);
s.erase(l1,len1);
l2 = l2-len1; //5、删除左边那个单词时,应该改变l2的值,但l1不用改变
s.insert(l1,s.substr(l2,len2));
l2 = l2+len2; //6、插入之后l1,l2都要改变,因为l1要变为插入单词的下一个位置
l1 = l1+len2;
s.erase(l2,len2);
s.insert(l2,temp); //7、删除第l2位置开始的单词,再从该位置插入新单词。刚开始以为l2要减一,但其实insert(index,string)的用法是从index开始插入,而不是从index的后一个开始
l2--; //8、插入单词的前一个位置
r2=l2;
// 第三步:处理字符串内部多余空格
int i,j;
if(l1 >= r2) //9、同4
break;
else{
for(i=l1; i<r2 && s[i+] == ' '; ++i); //10、找出左右多余空格
for(j=r2; j>l1 && s[j-] == ' '; --j);
if(i == j) //11、若位置l1和r2之间已经没有多余的单词,并且只有一个空格,则保留这个空格并结束
break;
else if(i > j) //12、若位置l1和r2之间已经没有多余的单词,但有多个空格,则删除多余的,只保留一个空格即可
{
s.erase(l1,i-l1);
r2=r2-(i-l1);
break;
}
//13、若位置l1和r2之间还有单词,则删除两边多余的空格
s.erase(l1,i-l1);
j=j-(i-l1);
r2=r2-(i-l1);
s.erase(j,r2-j);
r2=j-;
l1++;
} }
return s;
}
};

LeetCode 151 翻转字符串里的单词的更多相关文章

  1. C#版(击败100.00%的提交) - Leetcode 151. 翻转字符串里的单词 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  2. LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)

    151. 翻转字符串里的单词 151. Reverse Words in a String

  3. Java实现 LeetCode 151 翻转字符串里的单词

    151. 翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky th ...

  4. 微软面试题: LeetCode 151. 翻转字符串里的单词 出现次数:6

    题目描述: 给定一个字符串,逐个翻转字符串中的每个单词. 说明: 无空格字符构成一个 单词 .输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括.如果两个单词间有多余的空格,将反转后 ...

  5. leetcode python翻转字符串里的单词

    # Leetcode 151 翻转字符串里的单词### 题目描述给定一个字符串,逐个翻转字符串中的每个单词. **示例1:** 输入: "the sky is blue" 输出: ...

  6. 【LeetCode】151. 翻转字符串里的单词(剑指offer 58-I)

    151. 翻转字符串里的单词 知识点:字符串:双指针 题目描述 给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔 ...

  7. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  8. 力扣(LeetCode)翻转字符串里的单词 个人题解

    给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky the" 示例 2: 输 ...

  9. 【算法训练营day8】LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58-II. 左旋转字符串

    [算法训练营day8]LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58- ...

随机推荐

  1. word中的交叉引用

    分别使用“交叉引用”依次插入所需应用文献编号范围的第一个和最后一个. 所需引用处出现“[1][3]”   在引用处对两个编号操作:点击鼠标右键-选择“切换域代码”. [1]变为” {REF _Ref4 ...

  2. Confluence 6 创建一个空间

    在 Confluence 中并不限制你可以创建多少空间.你可以选择为你每一个小组,项目都创建一个空间,或者你也可以将这 2 者混合在一起.所有的这些都基于你的需求来决定的. 每一个 Confluenc ...

  3. 远程桌面连接报错:出现身份验证错误,要求函数不受支持,由于CredSSP加密Oracle修正。

    远程桌面连接错误: 解决方法: 1.在运行中输入gpedit.msc,启动本地组策略编辑器. 2.定位到计算机—管理模板—系统—凭据分配 3.点凭据分配—加密Oracle修正. 4.加密Oracle修 ...

  4. Python while循环实现重试

    try: pass#要执行的代码 except: 状态=True while 状态==True: try: winsound.Beep(800, 1000)#报警提示音 循环=300 while 循环 ...

  5. Python中单线程、多线程和多进程的效率对比实验

    GIL机制导致如下结果: Python的多线程程序并不能利用多核CPU的优势 (比如一个使用了多个线程的计算密集型程序只会在一个单CPU上面运行)python多线程适合io操作密集型的任务(如sock ...

  6. csu oj 1344: Special Judge

    Description Given a positive integer n, find two non-negative integers a, b such that a2 + b2 = n. I ...

  7. Winform下有关控件焦点问题

    工作中遇到这样一个需求,根据控件焦点弹出对应的代码帮助窗体.比如界面上,有两个TextBox需要进行代码帮助功能的实现. 首先是绑定主窗体的代码帮助事件. 首先要给代码帮助这个按钮绑定事件: priv ...

  8. FJUT16级第一周寒假作业题解I题

    涨姿势题3 TimeLimit:1000ms  MemoryLimit:128000KB 64-bit integer IO format:%lld Problem Description 涨姿势题就 ...

  9. 【转】Vue 脱坑记 - 查漏补缺(汇总下群里高频询问的xxx及给出不靠谱的解决方案)

    前言 文章内容覆盖范围,芝麻绿豆的破问题都有,不止于vue; 给出的是方案,但不是手把手一字一句的给你说十万个为什么! 有三类人不适合此篇文章: “喜欢站在道德制高点的圣母婊” – 适合去教堂 “无理 ...

  10. windows配置教程

    1.卸载预装软件 2.卸载非安装的预装软件 有些软件被改成了“绿色版”软件不能通过软件列表卸载,一般在C:\Program Files (x86)目录下 可以直接删除其文件夹,如果提示文件夹无法删除则 ...