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

题意:
翻转一个英文句子中单词顺序

解法1
思路: split分割 + 倒序

    public static String reverseWords(String s) {String[] wordsAndSpacing = s.split(" ");StringBuffer buffer = new StringBuffer();int count = 0;// 1. 计数wordsAndSpacing数组中的单词for (int i = 0; i < wordsAndSpacing.length; i++) {if (!wordsAndSpacing[i].equals("")) {count++;}}String[] words = new String[count];int index = 0;// 2. 把wordsAndSpacing中的单词倒序存放到words数组中for (int i = wordsAndSpacing.length - 1; i >= 0; i--) {if (!wordsAndSpacing[i].equals("")) {words[index++] = wordsAndSpacing[i];}}// 3. 遍历words数组,将单词追加到bufferfor (int i = 0; i < words.length; i++) {if (i == words.length - 1) buffer.append(words[i]);else buffer.append(words[i]).append(" ");}return buffer.toString();}

解法2(双指针法)
思路:

  • 先去除字符串的前后空格
  • 建立双指针倒序扫描字符串:p1用来找字符串中部位置的空格,p2指向子串的右顶点
  • p1与p2之间的子串append到StringBuffer中
  • 去除StringBuffer的前后空格
    public static String reverseWords(String s) {s = s.trim();int p1 = s.length() - 1;int p2 = p1;StringBuffer buffer = new StringBuffer();while (p1 >= 0) {// p1找到第一个空格while (p1 >= 0 && s.charAt(p1) != ' ') p1--;// 把p1与p2之间的单词追加到buffer中buffer.append(s, p1 + 1, p2 + 1).append(" ");// p1跳过空格来到第二个单词尾部while (p1 >= 0 && s.charAt(p1) == ' ') p1--;// p2记录单词右顶点p2 = p1;}return buffer.toString().trim();}

收获:

  • String类的trim()方法是去除前后空格,而不是去除所有空格

  • java中的字符串分割split()原理:

       String s = "00abc00def00";String[] strs = s.split("0");// 把s字符串看作:空串0空串0abc0空串0def0空串0空串// 这里的strs数组中的元素为{"", "", "abc", "", "def", "", ""}
    
  • StringBuffer中指定String区间来append,区间是左闭右开

剑指 Offer 58 - I. 翻转单词顺序 (双指针)相关推荐

  1. 【LeetCode】剑指 Offer 58 - I. 翻转单词顺序

    [LeetCode]剑指 Offer 58 - I. 翻转单词顺序 文章目录 [LeetCode]剑指 Offer 58 - I. 翻转单词顺序 一.双指针 一.双指针 算法解析: 倒序遍历字符串 s ...

  2. 【算法】剑指 Offer 58 - I. 翻转单词顺序

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

  3. 【LeetCode笔记】剑指 Offer 58 - I. 翻转单词顺序(Java、栈、双指针)

    文章目录 题目描述 思路 & 代码 二刷 题目描述 用栈来做挺简单的,也可以用双指针. 思路 & 代码 既然是反向,那么从后往前,用双指针截取出字符串即可. class Solutio ...

  4. LeetCode-剑指 Offer 58 - I. 翻转单词顺序

    剑指 Offer 58 - I. 翻转单词顺序 思路一:也是核心思想,就是先把句子中所有字符串取出放入字符串数组,再对数组中的字符串进行操作后重新连接即可,具体问题具体细节还需要按题目要求分析 而遍历 ...

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

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

  6. 剑指offer面试题58 - I. 翻转单词顺序(双指针)

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

  7. 字符串(一) | 剑指 Offer 58 - II. 左旋转字符串、541. 反转字符串 II、剑指 Offer 05. 替换空格、151. 反转字符串中的单词

    剑指 Offer 58 - II. 左旋转字符串 把前k个字符移动到结尾 翻转前k个字符,翻转剩余字符 翻转整个字符串 class Solution { public:void reverse(str ...

  8. LeetCode 03: T58. 最后一个单词的长度(简单); 剑指 Offer 05. 替换空格(简单); 剑指 Offer 58 - II. 左旋转字符串(简单)

    文章目录 T7: 58. 最后一个单词的长度(简单) 思路 解法: 双指针 T8: 剑指 Offer 05. 替换空格(简单) 思路 解法: replace T9: 剑指 Offer 58 - II. ...

  9. 【LeetCode】剑指 Offer 58 - II. 左旋转字符串

    [LeetCode]剑指 Offer 58 - II. 左旋转字符串 文章目录 [LeetCode]剑指 Offer 58 - II. 左旋转字符串 一.字符串切片 二.列表遍历拼接 三.字符串遍历拼 ...

最新文章

  1. 条件随机场 (CRF) 分词序列谈之一(转)
  2. android ART编译预优化
  3. C#中怎样在ToolStripMenuItem下再添加子级菜单
  4. boost::math模块计算 Bessel、Neumann 和 Airy 函数的零点的测试程序
  5. html 图片剪裁压缩,HTML5 canvas实现图片拉伸、压缩与裁剪
  6. mysql 闪回查询 sql_利用闪回查看Oracle表历史时刻数据
  7. exit和abort都是用来终止程序的函数
  8. trycatch处理流IO流中的异常
  9. pcb布线拐角处打地孔_嵌入式开发必看: PCB设计的这几个问题,你能明白了吗?...
  10. Jedis操作reids集群
  11. funCode课程实训(C++ )
  12. slam和orbslam3环境配置
  13. 数据分析—指标体系和报表
  14. 【转】IOS开发小技巧
  15. CorelDRAW如何设置填充颜色和边框颜色
  16. 从“无影”看云电脑的未来
  17. 怎样查找MP3音乐链接地址 用于QQ空间背景
  18. android 免root冻结,自冻FreezeYou(超强免ROOT冻结神器)
  19. 一个后端开发的 Vue 笔记【入门级】
  20. Altium Designer 14.1.5 Build 30772

热门文章

  1. Android 软键盘弹出,界面整体上移的问题
  2. Fortran 学习1--数据类型
  3. 面向对象的 XSLT编程
  4. 《设计模式详解》行为型模式 - 命令模式
  5. 量化策略回测ATRRSI
  6. 数据分析角度拆解可怕的庞氏骗局,究竟是怎么骗到人的?
  7. java实现文件上传和文件查看、下载
  8. android应用程序列表,List列表应用程序-小知识 #103
  9. php 给注册加上限制条件,在注册用户时用两个条件限制,该如何处理
  10. 并注册烧写钩子 获取启动介质类型_PyTorch中对张量登记注册反向传播的钩子函数,并展示调用顺序...