剑指 Offer 58 - I. 翻转单词顺序
题目描述

我的题解
方法一:库函数split()
- 要注意str.split()函数:
- 字符串str前有 n 个空格时,分割出来的字符串列表中会多出 n 个空字符串;
- 字符串str某两个字符串中有 n 个空格,分割出的字符串列表会多 n-1 个空字符串。
- 字符串str最后有空格,分割出的字符串列表里不会多出空字符串
- split()的例子如下:

本题代码如下
public String reverseWords(String s) {
if (s == null) return s;
String[] strList = s.split(" ");
StringBuilder res = new StringBuilder();
for (int i = strList.length - 1; i >= 0; i--) {
if (!"".equals(strList[i])) {
res.append(strList[i]+" ");
}
}
return res.toString().trim();
}
复杂度分析:
时间复杂度 O(N) :各函数时间复杂度如下
- split() 方法: 为 O(N) ;
- trim() 方法: 最差情况下(当字符串全为空格时),为 O(N)O(N) ;
空间复杂度 O(N) : 单词列表strList占用线性大小的额外空间。
方法二:双指针
思路分析
- 声明两个指针 i,j 分别用来确定单词头和单词尾,初始位置均指向字符串尾。倒序遍历字符串:
- 找到单词尾:指针 i一直向左移动,直到 i<0 或 指向的字符不再是空格时,停止移动,此时把 i 的值赋给j。此步骤确定了单词尾指针。
- 找到单词头:指针 i 一直向左移动,直到 i<0 或 指向的字符串不再是字母时,停止移动,此时,找到了单词头(单词从下标 i+1 开始到 j 结束)。
代码如下
public String reverseWords(String s) {
if (s == null) return s;
StringBuilder res = new StringBuilder();
int j = s.length()-1;
int i = j;
while (i >= 0) {
// 找单词尾
while (i >= 0 && s.charAt(i) == ' ') i--;
j = i;
// 找单词头
while (i >= 0 && s.charAt(i)!=' ') i--;
res.append(s.substring(i + 1, j+1)+' '); // 左闭右开
}
return res.toString().trim();
}
复杂度分析
- 时间复杂度:O(N),N为字符串长度,线性遍历字符串
- 空间复杂度:O(N),新建的res字符串总长度≤ N,占用O(N)大小的空间
剑指 Offer 58 - I. 翻转单词顺序的更多相关文章
- 剑指 Offer 58 - I. 翻转单词顺序 + 双指针
剑指 Offer 58 - I. 翻转单词顺序 Offer_58_1 题目描述 方法一:使用Split函数 package com.walegarrett.offer; /** * @Author W ...
- 力扣 - 剑指 Offer 58 - I. 翻转单词顺序
题目 剑指 Offer 58 - I. 翻转单词顺序 思路1 假如题目要求我们翻转字符串,那么我们可以从末尾往前开始遍历每一个字符,同时将每一个字符添加到临时空间,最后输出临时空间的数据就完成翻转了, ...
- 剑指 offer set 19 翻转单词顺序 && 字符串左旋
题目 1. 翻转单词 student. a am I 转换成 I am a student. 2. 字符串左旋 abba 1 转成 bbaa 总结 1. 先对每个单词旋转, 再整齐旋转 2. 先翻转一 ...
- 剑指offer系列47---翻转单词顺序
[题目]输入“I am a student.”>>>“.tneduts a ma I”.>>输出:student. a am I package com.exe9.off ...
- 【剑指Offer】按之字形顺序打印二叉树 解题报告(Python)
[剑指Offer]按之字形顺序打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...
- 剑指 Offer 58 - II. 左旋转字符串 + 简单题
剑指 Offer 58 - II. 左旋转字符串 Offer_58_2 题目描述 java代码 package com.walegarrett.offer; /** * @Author WaleGar ...
- 剑指offer-面试题58_1-翻转单词顺序-字符串
/* 题目: 输入一个英文句子,翻转单词顺序,但单词内部顺序不变. */ /* 思路: 先翻转整个句子,再将每个单词分别翻转一次. */ #include<iostream> #inclu ...
- 剑指offer(44)单词翻转序列
题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“student ...
- 《剑指offer》面试题58 - I. 翻转单词顺序
问题描述 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. ",则输出&quo ...
随机推荐
- 「从零单排canal 04」 启动模块deployer源码解析
基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...
- innobackupex 数据库备份
一,安装innobackupex CentOS: yum install percona-xtrabackup 二,备份数据 备份: innobackupex --user=user --passwo ...
- Centos8 - 图形界面和命令行切换
查看目前默认的启动方式 systemctl get-default 命令行模式:multi-user.target 图形界面模式:graphical.target 设置为图形界面模式 systemct ...
- 手写一个React-Redux,玩转React的Context API
上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...
- 【网鼎杯2018】fakebook
解题过程: 首先进行目录扫描,发现以下目录: user.php.bak login.php flag.php user.php robots.txt user.php.bak猜测存在源码泄露. 查看源 ...
- HTML5提高
HTML5提高 前言 我个人觉得,当你学会了一些最基本的标签其实是够用的,但是在很多网页中可以发现很多新的标签.这个时候不知道它是干嘛的实际上心里是非常没底的,所以在这里我打算写一篇HTML5提高的文 ...
- python 爬虫由于网络或代理不能用导致的问题处理方法
平时在爬取某些网页的时候,可能是由于网络不好或者代理池中的代理不能用导致请求失败.此时有们需要重复多次去请求,python中有现成的,相应的包供我们使用: 我们可以利用retry模块进行多次请求,如果 ...
- 数据可视化之 图表篇(一)Power BI可视化,几张图表认识疫情现状
近期国际疫情愈演愈烈,在这个特殊的时期,一方面仍要照顾好自己.不要为疫情防治添乱,另一方面,也可以利用疫情数据提升自己的数据分析和可视化技能. 下面是我制作的几个可视化图表,分别注释了每个可视化用到 ...
- HTML学习分享(一)
HTML学习小结(一) 1.css的全称是什么? 2.样式表的组成 3.浏览器读取编译css的顺序? (1)HTML基本选择器 1.通配符选择器 * { margin: 0; padding: 0; ...
- [C++面向对象]-C++成员函数和非成员函数
大纲: 1.成员函数和非成员函数 2.详细解释 3.总结 4.参考 1.成员函数和非成员函数 其实简单来说成员函数是在类中定义的函数,而非成员函数就是普通函数,即不在类中定义的函数,其中非成员 ...