LeetCode-151-中等-翻转字符串里面的单词
问题描述
给定一个字符串,逐个翻转字符串中的每个单词。
说明:
无空格字符构成一个 单词 。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 1:
输入:“the sky is blue”
输出:“blue is sky the”
示例 2:
输入:" hello world! "
输出:“world! hello”
解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入:“a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例 4:
输入:s = " Bob Loves Alice "
输出:“Alice Loves Bob”
示例 5:
输入:s = “Alice does not even like bob”
输出:“bob like even not does Alice”
提示:
1 <= s.length <= 104
s 包含英文大小写字母、数字和空格 ’ ’
s 中 至少存在一个 单词
分析思路
注意提示中加粗的部分,参数s前后可能有空格,要去掉前后的空格,单词与单词之间可能有多个空格,要减少到一个空格,所以判断当前字符数组中当前元素是不是空格,并且当前元素的前一个元素是不是空格,如果是连续的空格,只保留第一个空格,剩下的让不是空格的元素填充。最终得到一个合适的字符数组,计算出数组的有效长度。
接下来就是翻转单词的操作了,我们先把整个数组翻转一次,然后再将每个单词翻转一次,这样单词就成了我们想要的样子。翻转的方法就是两个指针,一个从左开始,一个从右开始,两者指向的元素进行交换,当两个指针碰头的时候交换结束。左右指针分别就是这个单词的下标区间的左区间和右区间。
单词翻转过后,还没有结束,因为我们规定单词语单词之间以空格分隔,但是最后一个单词的后面没有空格,需要对他进行额外的一次翻转,区间是[最后一个空格所在的下标+1,len);最终返回字符串,构造方法中传入的参数是字符数组,从0开始到len结束。
代码实现
具体每一步骤的解释都在注释中。
public String reverseWords(String s) {
if (s == null||s.equals("")){
return null;
}
//翻转字符串
char[] charArray = s.toCharArray();
//cur是慢指针,len代表有效长度(去掉两端的空格和连续的空格)
int cur=0,len = 0;
//space表示当前字符的前一个是不是空格,true是空格,false不是
boolean space = true;
//先求出有效长度并将字符数组中多余的空格去掉
for (int i = 0; i < charArray.length; i++) {
//如果当前字符不是空格
if(charArray[i]!=' '){
//将cur慢指针所指向的元素设置成当前元素
charArray[cur++] = charArray[i];
space = false;
}else if(space==false){
//如果当前是空格,并且当前元素的前一个元素不是空格,将cur指向的元素设置成空格
charArray[cur++] = charArray[i];
space=true;
}
}
//最终判断如果最后一个元素是空格,有效长度等于cur-1;否则等于cur
len = space?cur-1:cur;
//翻转字符串
reverseStr(charArray,0,len);
//区间翻转字符串,preIndex=-1起哨兵的作用
int prevIndex = -1;
for (int i = 0; i < len; i++) {
//如果当前元素不是空格直接continue
if(charArray[i]!=' '){
continue;
}
//是空格就进行区间翻转也是将一个个单词翻转
reverseStr(charArray,prevIndex+1,i);
//每次修改区间开始的位置就是空格所在的下标 [preIndex,i)
prevIndex = i;
}
//翻转最后一个单词
reverseStr(charArray,prevIndex+1,len);
return new String(charArray,0,len);
}
//翻转指定区间内的字符数组
private void reverseStr(char[] array,int li,int ri){
ri--;
while(li<ri){
swap(array,li,ri);
li++;
ri--;
}
}
//交换两个元素
private void swap(char [] array,int i,int j){
char temp = array[i];
array[i] = array[j];
array[j] = temp;
}

写有用的文章,希望对大家有所帮助!
LeetCode-151-中等-翻转字符串里面的单词的更多相关文章
- C#版(击败100.00%的提交) - Leetcode 151. 翻转字符串里的单词 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- [LeetCode] 151. Reverse Words in a String 翻转字符串中的单词
Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...
- LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)
151. 翻转字符串里的单词 151. Reverse Words in a String
- Java实现 LeetCode 151 翻转字符串里的单词
151. 翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky th ...
- 【LeetCode】151. 翻转字符串里的单词(剑指offer 58-I)
151. 翻转字符串里的单词 知识点:字符串:双指针 题目描述 给你一个字符串 s ,逐个翻转字符串中的所有 单词 . 单词 是由非空格字符组成的字符串.s 中使用至少一个空格将字符串中的 单词 分隔 ...
- 【LeetCode】151. Reverse Words in a String 翻转字符串里的单词(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.co ...
- [LeetCode] 186. Reverse Words in a String II 翻转字符串中的单词 II
Given an input string, reverse the string word by word. A word is defined as a sequence of non-space ...
- [LeetCode] 557. Reverse Words in a String III 翻转字符串中的单词 III
Given a string, you need to reverse the order of characters in each word within a sentence while sti ...
- leetcode python翻转字符串里的单词
# Leetcode 151 翻转字符串里的单词### 题目描述给定一个字符串,逐个翻转字符串中的每个单词. **示例1:** 输入: "the sky is blue" 输出: ...
- [LeetCode] Reverse Words in a String 翻转字符串中的单词
Given an input string, reverse the string word by word. For example, Given s = "the sky is blue ...
随机推荐
- AcWing 295. 清理班次
这题显然跟 区间覆盖 是一样的,而且值域在 \(1000000\) 以内,不用离散化,直接贪心求解即可. 具体地:设 \(nxt[i]\) 为从值域 \(i\) 出发,能到达最远的右端点. 一段段地跳 ...
- 深入理解Java虚拟机(七)——类文件结构
Java的无关性 由于计算机领域中有很多操作系统和硬件平台同时在竞争,所以,很多编程语言的程序设计会与其运行的平台和操作系统产生耦合,这样就大大增加了程序员的工作,为了适应不同的平台,需要修改很多代码 ...
- zstd c++ string 压缩&解压
zstd 简介 维基百科定义: Zstandard(或Zstd)是由Facebook的Yann Collet开发的一个无损数据压缩算法.该名称也指其C语言的参考实现.第1版的实现于2016年8月31日 ...
- Idea+Git+GitHub图文教程,一篇教程帮你搞定
导语 该文章主要记录如何在GitHub上创建远程仓库.如何创建本地仓库并把代码提交到GitHub.如何创建分支以及分支合并到主干的操作. 一.在GitHub上创建远程仓库 (前提:已经注册过githu ...
- MySQL全备及备份文件删除脚本
1.数据库全备 #!/bin/shv_user="root"v_password="mysql"backup_date=`date +%Y%m%d%H%M` M ...
- 面试 HTTP和HTML 浏览器
HTTP和HTML 浏览器 #说一下http和https #参考回答: https的SSL加密是在传输层实现的. (1)http和https的基本概念 http: 超文本传输协议,是互联网上应用最为广 ...
- 面试 02-CSS盒模型及BFC
02-CSS盒模型及BFC #题目:谈一谈你对CSS盒模型的认识 专业的面试,一定会问 CSS 盒模型.对于这个题目,我们要回答一下几个方面: (1)基本概念:content.padding.marg ...
- [日常摸鱼]bzoj1038 [ZJOI2008]瞭望塔-模拟退火/几何
题意:给一条平面内$n$个点的折线,要求在折线上搞一个高度$h$的瞭望塔,能够看见折线上所有的点,求$h$的最小值($n \leq 300$) updata2018.1.21 正解半平面交在另一篇里面 ...
- Flink相对于Spark的优点
Flink相对于Spark的优点 容错 Flink 基于两阶段提交实现了精确的一次处理语义. Spark Streaming 只能做到不丢数据,但是有重复. 反压 Flink 在数据传输过程中使用了分 ...
- 个人微信公众号搭建Python实现 -个人公众号搭建-构想(14.3.1)
@ 目录 1.需求 2.怎么做 关于作者 1.需求 个人便捷工具 2.怎么做 针对个人未认证订阅号拥有以下权限 以及微信网页的一些权限,但是由于开发微信网页有限制 可定制功能只有被动回复,以及这个素材 ...