• 第四章字符串_反转字符串里的单词


    吾日三省吾身

    还记得的梦想吗

    正在努力实现它吗

    可以坚持下去吗


    目录

    吾日三省吾身

    力扣题号:151. 反转字符串中的单词 - 力扣(LeetCode)

    题目描述

    示例

    提示:

    思路

    Java解法:思维爆炸

    总结


     

    力扣题号:151. 反转字符串中的单词 - 力扣(LeetCode)

    注:下述题目描述和示例均来自力扣

    题目描述

    给你一个字符串 s ,请你反转字符串中 单词 的顺序。

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

    返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

    注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

    示例

    示例 1:

    输入:s = "
    the sky is blue
    "
    输出:"
    blue is sky the
    "
    

    示例 2:

    输入:s = "  hello world  "
    输出:"world hello"
    解释:反转后的字符串中不能存在前导空格和尾随空格。
    

    示例 3:

    输入:s = "a good   example"
    输出:"example good a"
    解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
    

    提示:

    • 1 <= s.length <= 104
    • s 包含英文大小写字母、数字和空格 ' '
    • s 中 至少存在一个 单词

    进阶:如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 原地 解法。


    思路

    Java解法:思维爆炸

            我们只需要先去除开头和结尾的字符串然后去掉中间冗余的字符串即可。开头和中间的字符串可以通过双指针的方法,让快指针快速遍历,当遇到字母的时候把快指针的元素赋值给慢指针的元素既可以。然后尾部的空格使用数组复制一个大小刚刚合适的数组中即可。然后整体翻转字符串再单独的翻转即可。

    1. class Solution {
    2. public String reverseWords(String s) {
    3. // 删除空格
    4. char[] noSpace = removeSpace(s);
    5. // 翻转整个字符串
    6. reverseEveryone(noSpace,0,noSpace.length - 1);
    7. // 翻转单个单词
    8. reverseOneWord(noSpace);
    9. return new String(noSpace);
    10. }
    11. /**
    12. * 删除空格
    13. * @param str
    14. * @return
    15. */
    16. public char[] removeSpace(String str) {
    17. char[] chars = str.toCharArray();
    18. int first = 0;
    19. int second = 0;
    20. int len = chars.length;
    21. // hello..word.
    22. for (; second < len; second++) {
    23. if (chars[second] != ' ') {
    24. // 添加空格,确保没在开头添加
    25. if (first != 0) {
    26. chars[first] = ' ';
    27. // 然后让first++,不然会被重新覆盖
    28. first++;
    29. }
    30. // 这里second指向的就不是空格,将后面的单词迁移覆盖空格
    31. while (second < len && chars[second] != ' ') {
    32. chars[first] = chars[second];
    33. first++;
    34. second++;
    35. }
    36. // 但是如果就这样就结束了空格操作,确实空格没了,但是一个空格都没了,
    37. // 所以需要在每次删除空格之前添加一个空格
    38. // 但是开头不需要空格
    39. // 所以我们需要再开头增加一个空格的添加逻辑
    40. }
    41. }
    42. // 然后我们就只剩下了尾部的空格还没有删除
    43. // 我们只需要将它复制到一个新的字符数组里就行,这样尾部的自然就没有了
    44. // 参数
    45. //src – the source array.
    46. //srcPos – starting position in the source array.
    47. //dest – the destination array.
    48. //destPos – starting position in the destination data.
    49. //length – the number of array elements to be copied.
    50. char[] newChars = new char[first];
    51. System.arraycopy(chars, 0, newChars, 0, first);
    52. return newChars;
    53. }
    54. /**
    55. * 翻转整个字符串
    56. * @param chars
    57. */
    58. public void reverseEveryone(char[] chars, int start, int end){
    59. while (start < end){
    60. char temp = chars[start];
    61. chars[start] = chars[end];
    62. chars[end] = temp;
    63. start++;
    64. end--;
    65. }
    66. }
    67. /**
    68. * 反转单个单词
    69. * @param chars
    70. */
    71. public void reverseOneWord(char[] chars){
    72. // olleh dlrow
    73. // hello world
    74. int first = 0;
    75. int second = 0;
    76. for (; second < chars.length + 1; second++) {
    77. if (second == chars.length || chars[second] == ' '){
    78. reverseEveryone(chars, first, second - 1);
    79. first = second + 1;
    80. }
    81. }
    82. }
    83. }

    总结

    ヾ( ̄▽ ̄)Bye~Bye~

  • 相关阅读:
    解决vue项目中前后端交互的跨域问题、nginx代理配置
    WebKitX ActiveX 5.0.0.15221 Crack
    OpenCV校准棋盘集合
    手机扫描二维码的测试用例
    MATLAB主窗口与编辑器窗口分开为两个界面的解决办法
    关于如何找环形链表的入环点
    【无人机】基于Matlab模拟无人机群跟踪固定目标
    【回溯】组合总和
    【Linux】信号的产生
    flowable接口整理
  • 原文地址:https://blog.csdn.net/DDDDWJDDDD/article/details/136316846