151. 翻转字符串里的单词

知识点:字符串;双指针

题目描述

给你一个字符串 s ,逐个翻转字符串中的所有 单词 。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。

说明:

输入字符串 s 可以在前面、后面或者单词间包含多余的空格。

翻转后单词间应当仅用一个空格分隔。

翻转后的字符串中不应包含额外的空格

示例
输入:s = "the sky is blue"
输出:"blue is sky the" 输入:s = "  hello world  "
输出:"world hello"
解释:输入字符串可以在前面或者后面包含多余的空格,但是翻转后的字符不能包括。

解法一:调用API

要对字符串,包括集合里的常用方法很熟悉,这样就可以直接调用里面的常用方法,比如说去掉首尾空格,比如说以某个字符分割,比方说以某个字符连接,比方说反转;

class Solution {
public String reverseWords(String s) {
//利用API;
s = s.trim();
String[] str = s.split("\\s+"); //正则表达式,根据一个或多个空格分割;
List<String> list = new ArrayList<>();
for(String i : str){
list.add(i); //将字符串加入列表;
}
Collections.reverse(list); //直接调用反转方法;
return String.join(" ", list); //字符串常用方法,以空格连接,返回一个字符串;
}
}

时间复杂度:O(N);

空间复杂度:O(N);

解法二:手写方法

我们上面主要使用了两个方法:去掉空格,反转;所以我们需要手动实现这两个方法;

  1. 去掉首尾两边和中间的多余空格;
  2. 将整个字符串反转;
  3. 将字符串里单个字符再反转;

    需要注意的是,在java里字符串是不可变量,所以需要将其转化为可变的数据结构,比如数组;
class Solution {
public String reverseWords(String s) {
StringBuilder sb = trimSpaces(s);
reverse(sb, 0, sb.length()-1);
reverseWord(sb);
return sb.toString();
}
//去掉首尾和多余空格;
private StringBuilder trimSpaces(String s){
int left = 0, right = s.length()-1;
while(left <= right && s.charAt(left) == ' '){
left++;
} //去掉左侧空格,定位到左侧第一个无空格处;
while(left <= right && s.charAt(right) == ' '){
right--;
} //同理去掉右侧空格;
StringBuilder sb = new StringBuilder();
while(left <= right){
char c = s.charAt(left);
if(c != ' ') sb.append(c);
//到这证明遇到空格了,这时候看sb里最后一个不是空格就给加进去;
else if(sb.charAt(sb.length()-1) != ' ') sb.append(c);
left++;
}
return sb;
}
//反转整个字符;
private void reverse(StringBuilder sb, int front, int tail){
while(front < tail){
char temp = sb.charAt(front); //注意StringBuilder底层是数组,
//但是没有sb[front];获取指定索引就用charAt,包括String也是;
sb.setCharAt(front, sb.charAt(tail));
sb.setCharAt(tail, temp);
front++;
tail--;
}
}
//反转单个单词;
private void reverseWord(StringBuilder sb){
int start = 0, end = 0; //end记录每个单词的最后;
int l = sb.length();
while(start < l){
while(end < l && sb.charAt(end) != ' '){
end++;
} //end指定空格处;
reverse(sb, start, end-1);
start = end+1; //更新为下一个单词首处;
end++;
}
}
}

时间复杂度:O(N);

空间复杂度:O(N);

解法三:双指针

先把首尾空格去掉,然后定义两个指着,从后往前,分别指向每个单词的首和尾,再加入StringBuilder里;

class Solution {
public String reverseWords(String s) {
s = s.trim(); //去掉首尾空格;
StringBuilder sb = new StringBuilder();
int i = s.length()-1, j = i; //两个指着一个指向单词开头,一个指向结尾;
while(i >= 0){
while (i >= 0 && s.charAt(i) !=' ') i--; //i停在空格上;
sb.append(s.substring(i+1, j+1)+' '); //前开后闭;添加单词;
while (i >= 0 && s.charAt(i) == ' ') i--; //跳过空格;
j = i; //j指向下一个单词的尾;
}
return sb.toString().trim(); //因为上面在每个单词后面都加了空格,所以把最后的结尾的删除;
}
}

时间复杂度:O(N);

空间复杂度:O(N);

体会

  • 要知道字符串的特点:在java语言中是不可变性。所以只要是需要修改字符串就需要引入新的可变的数据结构,常用StringBuilder。
  • 要对String、StringBuilder常用方法熟悉;能想到。

相关链接

翻转字符串里单词

[剑指offer58-I 翻转单词顺序](https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/solution/mian-shi-ti-58-i-fan-zhuan-dan-ci-shun-xu-shuang-z/

【LeetCode】151. 翻转字符串里的单词(剑指offer 58-I)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. PCB的IPC标准是什么

    PCB的IPC标准是什么 印刷电路研究所成立于1957年,有6家印刷电路板制造商.1977年,许多电子公司与工控机联合起来,以实现电子电路的互连和封装.1998年,IPC协会创建了一个"连接 ...

  2. GVS案例分享|乘新时代姑苏舫号,体验匠心智能控制

    水,是苏州的灵魂,串起苏州的古与今.动与静.金鸡湖景区位于苏州工业园区,总面积11.5平方公里,其中水域面积7.4平方公里. 新时代姑苏舫号,是金鸡湖景区极具苏式特征且规格超高的游览船型.船体分为上下 ...

  3. 一枚通过参数污染绕过百度RASP的XSS

    日常工作过程中,偶然发现一个网站登录页面,在页面返回包中存在一个隐藏参数"mess",且该页面部署了百度RASP进行防护,本文介绍如何发现隐藏参数以及如何通过参数污染方式造成XSS ...

  4. Redis6.x学习笔记(五)哨兵

    前言 最近学习Redis6.x,特做笔记以备忘,与大家共学.课程是从私塾在线下载的,他们把架构师课程都放出来了,大家可以去下载学习,不要钱的,地址是http://t.hk.uy/eK7,课程很不错,值 ...

  5. 【NX二次开发】获取视图当前的剪辑边界UF_VIEW_ask_current_xy_clip()

    UF_VIEW_ask_current_xy_clip()这个函数网上还没有详细的说明,我花了一点时间,详细得理解了一下函数返回的4个值的意思,作为一个猜想,希望有人能验证一下. 获取视图当前的剪辑边 ...

  6. 网页站点下载器teleport ultra

    软件名称:teleport ultra 介绍:teleport ultra是一款专门的网页站点下载器,使用这款工具可以方便地下载网页数据,包括网站的文字.图片.flash动画等,可以轻松下载所有的网站 ...

  7. 【NX二次开发】用户出口函数介绍

    用户出口(User Exit)是NX Open 中的一个重要概念.NX在运行过程中某些特定的位置存在规定的出口,当进程执行到这些出口时,NX会自动检查用户是否在此处已定义了指向内部程序位置的环境变量: ...

  8. xshell连接时报错:Could not connect to '192.168.2.125' (port 22): Connection failed.

    解决思路: 1.首先用主机ping下虚拟机IP,看是否能ping通 2.如果ping不通就看虚拟机防火墙是否开启,service iptables status [root@mysql ~]# ser ...

  9. MySQL到ClickHouse实时同步-CloudCanal实战

    简述 CloudCanal 近期实现了 MySQL(RDS) 到 ClickHouse 实时同步的能力,功能包含全量数据迁移.增量数据迁移.结构迁移能力,以及附带的监控.告警.HA等能力(平台自带). ...

  10. 『动善时』JMeter基础 — 50、使用JMeter测试WebSocket接口

    目录 1.什么是WebSocket接口 2.为什么需要WebSocket 3.测试WebService接口前的准备 4.WebSocket Sampler组件界面详解 5.使用JMeter测试WebS ...