本题 题目链接

题目描述




我的题解

方法一:库函数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. 翻转单词顺序的更多相关文章

  1. 剑指 Offer 58 - I. 翻转单词顺序 + 双指针

    剑指 Offer 58 - I. 翻转单词顺序 Offer_58_1 题目描述 方法一:使用Split函数 package com.walegarrett.offer; /** * @Author W ...

  2. 力扣 - 剑指 Offer 58 - I. 翻转单词顺序

    题目 剑指 Offer 58 - I. 翻转单词顺序 思路1 假如题目要求我们翻转字符串,那么我们可以从末尾往前开始遍历每一个字符,同时将每一个字符添加到临时空间,最后输出临时空间的数据就完成翻转了, ...

  3. 剑指 offer set 19 翻转单词顺序 && 字符串左旋

    题目 1. 翻转单词 student. a am I 转换成 I am a student. 2. 字符串左旋 abba 1 转成 bbaa 总结 1. 先对每个单词旋转, 再整齐旋转 2. 先翻转一 ...

  4. 剑指offer系列47---翻转单词顺序

    [题目]输入“I am a student.”>>>“.tneduts a ma I”.>>输出:student. a am I package com.exe9.off ...

  5. 【剑指Offer】按之字形顺序打印二叉树 解题报告(Python)

    [剑指Offer]按之字形顺序打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  6. 剑指 Offer 58 - II. 左旋转字符串 + 简单题

    剑指 Offer 58 - II. 左旋转字符串 Offer_58_2 题目描述 java代码 package com.walegarrett.offer; /** * @Author WaleGar ...

  7. 剑指offer-面试题58_1-翻转单词顺序-字符串

    /* 题目: 输入一个英文句子,翻转单词顺序,但单词内部顺序不变. */ /* 思路: 先翻转整个句子,再将每个单词分别翻转一次. */ #include<iostream> #inclu ...

  8. 剑指offer(44)单词翻转序列

    题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“student ...

  9. 《剑指offer》面试题58 - I. 翻转单词顺序

    问题描述 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student. ",则输出&quo ...

随机推荐

  1. python 如何判断一组数据是否符合正态分布

    正态分布: 若随机变量x服从有个数学期望为μ,方差为σ2 的正态分布,记为N(μ,σ) 其中期望值决定密度函数的位置,标准差决定分布的幅度,当υ=0,σ=0 时的正态分布是标准正态分布 判断方法有画图 ...

  2. 传递 HDU - 5961 题解

    题目传送门 分析 题目大意:给一个竞赛图,将图分成两部分,判断两部分的图是否符合传递闭包,a->b,b->c,则a->c 这道题用Floyd硬跑的显然n\({^3}\)会T 如果用b ...

  3. Google 出品的 Java 编码规范,强烈推荐,既权威又科学

    这份文档是 Google Java 编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才认为它符合Google的Java编程风格.原文:google.github.io/st ...

  4. Python-01矩阵、数组和列表等的总结

    python的基础知识总结 使用到了numpy库,所以第一步需要 import numpy as np 1.创建矩阵 1.1一般矩阵的创建 创建一个二维的矩阵,并使用ndim.shape.size分别 ...

  5. (八) SpringBoot起飞之路-整合Shiro详细教程(MyBatis、Thymeleaf)

    兴趣的朋友可以去了解一下前几篇,你的赞就是对我最大的支持,感谢大家! (一) SpringBoot起飞之路-HelloWorld (二) SpringBoot起飞之路-入门原理分析 (三) Sprin ...

  6. C# Dictionary的底层实现解析

    引用: https://www.cnblogs.com/InCerry/p/10325290.html 字典原理分析: 1.用数组存元素,元素的结构体存hashCode.next.key.value. ...

  7. bzoj1339[Baltic2008]Mafia*

    bzoj1339[Baltic2008]Mafia 题意: 匪徒准备从一个车站转移毒品到另一个车站,警方准备进行布控.对于每个车站进行布控都需要一定的代价,现在警方希望使用最小的代价控制一些车站,使得 ...

  8. Interllij Idea 环境必要配置

    必要设置:https://blog.csdn.net/weixin_43378248/article/details/84673406 1. @Autowired 取消错误提示 (1)选择file - ...

  9. Python Ethical Hacking - Malware Analysis(4)

    DOWNLOAD_FILE Download files on a system. Once packaged properly will work on all operating systems. ...

  10. c# Winfrom-DataGridView实现筛选功能

      //应对用户需求,需要在DataGridView中直接进行筛选功能,在网上找了一些代码加上自己修改整理过后的类,仅供参考! //上面代码可以直接创建类库项目生成DLL文件,下面代码为另外项目引用创 ...