LeetCode 151:给定一个字符串,逐个翻转字符串中的每个单词 Reverse Words in a String
公众号:爱写bug(ID:icodebugs)
翻转字符串里的单词
Given an input string, reverse the string word by word.
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
Note:
- A word is defined as a sequence of non-space characters.
- Input string may contain leading or trailing spaces. However, your reversed string should not contain leading or trailing spaces.
- You need to reduce multiple spaces between two words to a single space in the reversed string.
Follow up:
For C programmers, try to solve it in-place in O(1) extra space.
解题思路:
Java 字符串不支持运算符重载,无法用原地解法。 我们将字符串转为字符型数组并用两个指针来解这道题。指针 i 作为原字符串转为字符数组的索引,从右向左移。指针 j 作为新字符数组索引,从左向右赋值得到原数组 count 长度的字符。count记录遇到的字母数量,每次遇到 空格 字符,新数组得到从该空格字符 向右 count 个字符并刷新count 计数。
Java:
class Solution {
public String reverseWords(String s) {
if (s.length()==0)return s;//如果为空直接返回
char strs[]=s.toCharArray(),ans[]=new char[s.length()];//字符串转为char字符数组
int count=0,j=0;//全局变量j记录新数组索引
for(int i=s.length()-1;i>=0;i--){指针i从右向左遍历strs字符
if(strs[i]==' '){//判断是否为空格字符
int k=i+1;
if(count>0){
while (--count>=0){//从字符i向右count个字符赋给新数组ans
ans[j++]=strs[k++];
}
ans[j++]=' ';
count=0;//count初始化为0
}
}else if(i==0){
for(;i<=count;i++)ans[j++]=strs[i];//左移到第一个字符时证明不是以空格开头,则从0获取count+1个个字符赋给ans
j+=1;
break;
}
else {
count++;//如果是字母,则count累加1
}
}
if(j<1)return "";//如果j依然是0,则原字符串全为空格,返回空字符串
String string=String.valueOf(ans,0,j-1);//char数组转为字符串返回
return string;
}
}
为了考虑性能,转成了多个判断,所以有些繁琐。最终运行:Your runtime beats 99.91 % of java submissions
Python3:
python完全可以实现Java的思路,不再复现。这里利用函数投机取巧:
split() ,它可以把传入字符串剔除空格后返回 所有单词的数组
join() ,它可以指定一个数组以特定字符为间隔,拼接成一个字符串
加上 [::-1] 反转数组,一行代码既可实现该题目要求
' abc def ' 原字符串
['abc' , 'def'] 剔除空格返回String型单词数组
['def' , 'abc'] 切片反转数组
'def abc' 拼接成字符串
class Solution:
def reverseWords(self, s: str) -> str:
return " ".join(s.split()[::-1]) # 剔除所有空格字符返回数组并反转,以空格为间隔把数组拼成字符串

LeetCode 151:给定一个字符串,逐个翻转字符串中的每个单词 Reverse Words in a String的更多相关文章
- [Swift]LeetCode151. 翻转字符串里的单词 | Reverse Words in a String
Given an input string, reverse the string word by word. Example: Input: "the sky is blue", ...
- Gym 101064 D Black Hills golden jewels 【二分套二分/给定一个序列,从序列中任意取两个数形成一个和,两个数不可相同,要求求出第k小的组合】
D. Black Hills golden jewels time limit per test 2 seconds memory limit per test 256 megabytes input ...
- LeetCode 151. 翻转字符串里的单词(Reverse Words in a String)
151. 翻转字符串里的单词 151. Reverse Words in a String
- [Swift]LeetCode345. 反转字符串中的元音字母 | Reverse Vowels of a String
Write a function that takes a string as input and reverse only the vowels of a string. Example 1: In ...
- python输入一个字符串,输出翻转后的字符串(翻转字符串)
题目:输出一个字符串,输出翻转后的字符串.例如:输入字符串a123,输出321a. 方法一:使用列表的reverse方法 string=input('请输入一个字符串:') lst=list(stri ...
- 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转 1 步: [7,1,2,3,4,5,6] 向右旋转 2 步: [6,7,1 ...
- C#版(击败100.00%的提交) - Leetcode 151. 翻转字符串里的单词 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- Java实现 LeetCode 151 翻转字符串里的单词
151. 翻转字符串里的单词 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky th ...
- LeetCode 151 翻转字符串里的单词
题目: 给定一个字符串,逐个翻转字符串中的每个单词. 示例 1: 输入: "the sky is blue" 输出: "blue is sky the" 示例 ...
随机推荐
- 打开Github网站反应慢的问题
解决办法: 为了提高速度,可以使用HOSTS加速对Github网站加载的资源网站域名解析. 具体做法: 修改 C:\Windows\System32\drivers\etc 中的hosts文件(P ...
- gcc原子操作测试
#include <stdio.h> #include <pthread.h> #include <stdlib.h> ; void *test_func(void ...
- [LeetCode#184]Department Highest Salary
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...
- 分析一个简单的WPF程序
1.新建WPF项目 使用Visual Studio 代码编辑器点击新建项目,选择 WPF应用后点击下一步: 在新窗口中我们填写项目名称.选择项目位置后点击创建就完成了WPF项目的创建. 2.WPF项目 ...
- DataGridView中获取与设置当前选中行以及SelectedRows和CurrentRow注意区分
场景 DataGridView怎样实现添加.删除.上移.下移一行: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10281414 ...
- node开发基础概念
1.以严格模式运行一个js文件 node --use_strict xxx.js 2.退出node交互模式 连续按两次Ctrl+C. 3,node.js的模块不支持ES6的export.import规 ...
- JS常用标签
1.由来 JavaScript的出现就是为了解决,不需要将所有的表单数据全部提交到服务器. 2.添加 加载Js代码的三种方式: 第一种:<script></script>标签里 ...
- 采坑 - LODOP,打印预览
结合 layui.弹出框内容样式如下: 红框表示,左右的内边距. 图一 打印预览的样式如下:红框表示,左右的内边距. 图二 要根据图二的左右内边距,去修改图一的左右内边距.不然会影响正文内容高度的判断 ...
- IDEA下新建Vue项目
1.首先需要安装nodeJS,并配置全局环境变量. 2.在IDEA中新建一个空的project 3.在setting中配置JavaScript的语言版本为6 在file types的html中添加.* ...
- ES新提案:双问号操作符
摘要: 简单实用的新特性. 原文:ES新提案:双问号操作符 译者:前端小智 本文主要讲Gabriel Isenberg撰写的ES提案"Nullish coalescing for JavaS ...