当前位置: 首页 > article >正文

【算法系列-字符串】反转字符串中的单词

【算法系列-字符串】反转字符串中的单词

文章目录

  • 【算法系列-字符串】反转字符串中的单词
    • 1. 算法分析
    • 2. 解题过程
      • 2.1 去除多余空格
      • 2.2 反转整个字符串
      • 2.3 对每个单词进行反转
    • 3. 代码示例

1. 算法分析

【题目链接】151. 反转字符串中的单词 - 力扣(LeetCode)

这道题比较麻烦的是需要去除多余的空格并保留单词间的空格,我这里提供一份使用库函数(java中的split)解决的代码:

class Solution {
    public String reverseWords(String s) {
        String[] arr = s.split(" ");
        reverse(arr, 0, arr.length - 1);
        StringBuffer sub = new StringBuffer();
        for (int i = 0;i < arr.length;i++) {
            if ("".equals(arr[i])) {
                continue;
            }
            sub.append(arr[i]);
            sub.append(" ");
        }
        if (sub.substring(sub.length() - 1).equals(" ")) {
            return sub.substring(0, sub.length() -1).toString();
        }
        return sub.toString();
    }

    public void reverse(String[] arr, int left, int right) {
        while (left < right) {
            String temp = arr[left];
            arr[left++] = arr[right];
            arr[right--] = temp;
        }
    }
}

但这样做空间复杂度就会比较高,为了起到锻炼作用,我这里也用另一种方式解决这道题,那就是双指针!

分三步走:

  1. 去除多余空格
  2. 反转整个字符串
  3. 对每个单词进行反转

2. 解题过程

2.1 去除多余空格

使用快慢指针的方式来删除多余的空格,具体方式与之前写过的一篇文章类似,不理解的可以参考一下: 【算法系列-移除元素】

需要注意:

  • 当fast指向了一个新的单词,且当slow指向位置不是数组首位时,需要在这个新单词前面加一个空格;
  • 每一次都要将新单词的所有字符都遍历完毕才能结束循环;

代码如下:

public char[] removeSpace(char[] arr) {
   int slow = 0;
   for (int fast = 0;fast < arr.length;fast+
       if (arr[fast] != ' ') {
           
           // 进入这里表示fast指向了一个新的单词,且当slow指向位置不是数组首位时,需要在这个新单词前面加一个空格
           if (slow !=  0) {
               arr[slow++] = ' ';
        
           // 需要循环将这个单词遍历完
           while (fast < arr.length && arr[fast] != ' ') {
               arr[slow++] = arr[fast++];
           }
       }
   }
   char[] retArr = new char[slow];
   System.arraycopy(arr, 0, retArr, 0, slow);
   return retArr;
}

2.2 反转整个字符串

这一个方法与上篇文章【算法系列-反转字符串】介绍的一样,这里就不过多赘述

代码如下:

public void reverse(char[] arr, int left, int right
    while (left < right) {
        char temp = arr[left];
        arr[left++] = arr[right];
        arr[right--] = temp;
    }
} 

2.3 对每个单词进行反转

需要注意:

  • fast == arr.length 是为了判断指向最后一个单词时的情况;
  • 当fast指向数组末尾 或 fast指向的字符为空时,对这个单词进行反转(slow 到 fast - 1 便是当前单词的范围);
  • slow = fast + 1 这里的 + 1 是为了跳过空字符;

代码如下:

public void reverseWord(char[] arr
    int slow = 0;
    for (int fast = 0;fast <= arr.length;fast++) {
        if (fast == arr.length || arr[fast] == ' ') {
            // fast == arr.length 是为了判断指向最后一个单词时的情况
            // 当fast指向数组末尾 或 fast指向的字符为空时,对这个单词进行反转(slow 到 fast - 1 便是当前单词的范围)
            reverse(arr, slow, fast - 1);
            slow = fast + 1; // +1 是为了跳过空字符
        }
    }
}

3. 代码示例

总的代码如下:

class Solution {
    public String reverseWords(String s) {
        char[] arr = s.toCharArray();

        // 1. 去除多余空格
        arr = removeSpace(arr);

        // 2. 反转所有字符
        reverse(arr, 0, arr.length - 1);

        // 3. 对每个单词进行反转
        reverseWord(arr);

        return new String(arr);

    }

    public char[] removeSpace(char[] arr) {
        int slow = 0;
        for (int fast = 0;fast < arr.length;fast++) {

            if (arr[fast] != ' ') {
                
                // 进入这里表示fast指向了一个新的单词,且当slow指向位置不是数组首位时,需要在这个新单词前面加一个空格
                if (slow !=  0) {
                    arr[slow++] = ' ';
                }

                // 需要循环将这个单词遍历完
                while (fast < arr.length && arr[fast] != ' ') {
                    arr[slow++] = arr[fast++];
                }
            }
        }
        char[] retArr = new char[slow];
        System.arraycopy(arr, 0, retArr, 0, slow);
        return retArr;
    }

    public void reverse(char[] arr, int left, int right) {

        while (left < right) {
            char temp = arr[left];
            arr[left++] = arr[right];
            arr[right--] = temp;
        }
    } 

    public void reverseWord(char[] arr) {

        int slow = 0;
        for (int fast = 0;fast <= arr.length;fast++) {
            if (fast == arr.length || arr[fast] == ' ') {
                // fast == arr.length 是为了判断指向最后一个单词时的情况
                // 当fast指向数组末尾 或 fast指向的字符为空时,对这个单词进行反转(slow 到 fast - 1 便是当前单词的范围)
                reverse(arr, slow, fast - 1);
                slow = fast + 1; // +1 是为了跳过空字符
            }
        }
    }
}

以上便是对反转字符串中的单词问题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨


http://www.kler.cn/news/355721.html

相关文章:

  • 深入探讨ASP.NET Core中间件及其请求处理管道特性
  • 1.1 C++语言基础面试问题
  • 基于Arduino做的“鱿鱼游戏”BOSS面具,支持动作检测
  • 软件设计——数据流图
  • arm-none-linux-gnueabi-strip的作用
  • Springboot接入Elastic
  • AWTK fscript 中的 widget 扩展函数
  • C++ 学习笔记 十二 结构体
  • 深度学习框架-Keras的常用内置数据集总结
  • nacos组件介绍
  • 智能指针(3)
  • 构建 effet.js 人脸识别交互系统的实战之路
  • Linux 和Windows创建共享文件夹实现文件共享
  • 产品推介——高压晶体管光耦KL851
  • Mybatis多对一查询的配置及两种方法的使用示例对比以及Mybatis一对多查询两种方法使用示例及对比
  • Android中的Room数据库框架
  • 如何使用代理来保护你的电子邮件?
  • 了解一些常用的Javascript对象方法
  • Python网络爬虫入门指南
  • 使用JavaScript开发扑克牌游戏:从零开始的前端之旅