公众号:爱写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的更多相关文章

  1. [Swift]LeetCode151. 翻转字符串里的单词 | Reverse Words in a String

    Given an input string, reverse the string word by word. Example: Input: "the sky is blue", ...

  2. 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 ...

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

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

  4. [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 ...

  5. python输入一个字符串,输出翻转后的字符串(翻转字符串)

    题目:输出一个字符串,输出翻转后的字符串.例如:输入字符串a123,输出321a. 方法一:使用列表的reverse方法 string=input('请输入一个字符串:') lst=list(stri ...

  6. 给定一个数组,将数组中的元素向右移动 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 ...

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

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

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

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

  9. LeetCode 151 翻转字符串里的单词

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

随机推荐

  1. Java13 闪亮来袭,你是否还停留在 Java8

    近期 Java 界好消息频传.先是 Java 13 发布,接着 Eclipse 也发布了新版本表示支持新版本的 Java 特性. 本文介绍了 Java 13 的新特性并展示了相关的示例. 2019 年 ...

  2. IT兄弟连 Java语法教程 赋值运算符

    从本书之前的内容中就一直在使用赋值运算符.现在是正式介绍赋值运算符的时候了.赋值运算符是单个等号”=“.在Java中,赋值运算符的工作方式与所有其它计算机语言相同.它的一般形式如下: var = ex ...

  3. POJ 1724 (分层图最短路)

    ### POJ 1724 题目链接 ### 题目大意: 给你 N 个点 ,M 条有向路,走每条路需要花费 C 元,这段路的长度为 L . 给你 K 元,问你能否从 1 走到 N 点且花费不超过 K 元 ...

  4. SSD与HDD、HHD的区别

    SSD与HDD.HHD的区别 HDD机械硬盘 SSD固态硬盘 HHD混合硬盘

  5. 一个小事例,了解golang通道阻塞模式

    在学习golang中,channel真的是让人捉摸不透的东西,本来我自以为我理解了协程阻塞的用法了,结果就下面这个小例子,我还是在打印输出后才搞明白到底怎么回事? 当然了,这也是我自身对协程这块不太熟 ...

  6. springMVC校验器(validator)

    springmvc使用的是Hibernate Validator(和Hibernate的ORM无关)来完成校验功能 一.普通校验 1.导入jar包 2.编写校验错误配置文件 3.配置校验错误信息文件 ...

  7. webservice调用天气服务

    常见服务:http://www.webxml.com.cn/zh_cn/support.aspx 可能用到缺少的ArrayOfString.java文件 package com.test.wes.we ...

  8. 自定义滚动条样式纯(css)

    啥都不说先看图: 注: 只适合chrom,不适用IE和fireFox 下面展示代码: <html lang="en"> <head> <meta ch ...

  9. IOS中的深拷贝和浅拷贝

    标签: 什么是深拷贝?什么是浅拷贝? 为什么经常看到字符串属性要这样定义,那个copy是神马意思? @property(nonatomic,copy)NSString* name; 为什么下面的写法是 ...

  10. Android Activity 开发常用技巧整理

    1.设置 Activity 背景色为透明 在style.xml里面声明: <style name="TranslucentActivityStyle" parent=&quo ...