算法——反转字符串中的单词(leetcode151)

解析:

这道题有点难度我是在学习了别人的解题过程之后才对这道题的解法逐渐清晰,其实我刚入手这道题的时候我的想法就是先去除空格、然后反转整个字符串接着反转字符串里的每个单词即可我明白思路但却一直做不出来,原因就在于怎样合适的去除空格,以及去除空格后我们存在怎样合适的字符串数据类型当中,然后就是怎样处理每个单词的反转,由于上述原因导致我一直碰壁后来经过学习才发现大体方向是对的只要注意细节即可成功解开。

解题步骤:

一、去除字符串的首尾空格以及中间部分多余的空格

去除首尾空格我们可以采用首指针和尾指针如果首字符等于' '那么我们就向右移动首指针如果尾字符等于' '那么就向左移动尾指针移动完毕我们就可以得到一个首尾没有空格的字符串区间,接着利用这个区间我们来去除字符串中间多余的空格,我们采取创建一个StringBuilder类来存储新的字符串,因为StringBuilder类是可修改字符串的,接下来一个条件尤为重要

java 复制代码
if(c!=' '||sb.charAt(sb.length()-1)!=' ')sb.append(c);

通过这个条件我们可以使新的字符串中各个单词之间只有一个空格接着我们返回新的字符串即可。

二、反转整个字符串

将新的字符串传入反转字符串的方法中,通过StringBuilder的setCharAt()方法来完成字符的交换以及字符串的反转。

三、反转单词

反转单词我们利用双指针来确定单词区间,如果sb.charAt(end)不等于' '那么我们就向右移动单词尾指针

java 复制代码
 while(end<n&&sb.charAt(end)!=' ')end++;

接着通过start、end确定单词区间调用步骤二的反转字符串的方法完成单词的反转(要注意传入end-1的原因是我们先对end++然后判断其是否为' '所以我们要找到单词区间的尾部必须使其end-1传入字符串反转方法中)

java 复制代码
reverseString(start,end-1,sb);

单词反转完毕接着移动单词区间首指针和尾指针的位置于下一位即可或者字符串单词全部反转完毕跳出循环即可

java 复制代码
start=end+1;
end=start+1;

四、返回结果

完整代码:

java 复制代码
class Solution {
    public String reverseWords(String s) {
        StringBuilder sb=removeSpace(s);
        reverseString(0,sb.length()-1,sb);
        reverseWord(sb);
        return sb.toString();
    }
    public StringBuilder removeSpace(String s){
        StringBuilder sb=new StringBuilder();
        int start=0;
        int end=s.length()-1;
        //去除字符串首尾空格
        while(s.charAt(start)==' ')start++;
        while(s.charAt(end)==' ')end--;
        //去除字符串中间部分多余空格
        while(start<=end){
            char c=s.charAt(start);
            if(c!=' '||sb.charAt(sb.length()-1)!=' ')sb.append(c);
            start++;
        }
        return sb;
    }
    public void reverseString(int start,int end,StringBuilder sb){
        //反转字符串
        while(start<end){
            char temp=sb.charAt(start);
            sb.setCharAt(start,sb.charAt(end));
            sb.setCharAt(end,temp);
            start++;
            end--;
        }
    }
    public void reverseWord(StringBuilder sb){
        int start=0;
        int end=1;
        int n=sb.length();
        while(start<n){
        //确定单词区间
        while(end<n&&sb.charAt(end)!=' ')end++;
        //反转单词
        reverseString(start,end-1,sb);
        start=end+1;
        end=start+1;
        }
    }
}
相关推荐
苹果酱05674 分钟前
Golang中的runtime.LockOSThread 和 runtime.UnlockOSThread
java·vue.js·spring boot·mysql·课程设计
会飞的鱼先生6 分钟前
vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件
前端·vue.js·git·json
!win !25 分钟前
uni-app项目从0-1基础架构搭建全流程
前端·uni-app
我命由我123451 小时前
Android 动态申请 REQUEST_INSTALL_PACKAGES 权限问题:申请权限失败
android·java·开发语言·java-ee·android studio·android jetpack·android-studio
c_zyer1 小时前
使用 nvm 管理 Node.js 和 npm 版本
前端·npm·node.js
令狐少侠20111 小时前
idea2024 不知道安装了什么插件,界面都是中文的了,不习惯,怎么修改各个选项改回英文
java·idea
布Coder1 小时前
前端 vue + element-ui 框架从 0 - 1 搭建
前端·javascript·vue.js
i_am_a_div_日积月累_1 小时前
Element Plus 取消el-form-item点击触发组件,改为原生表单控件
前端·vue.js·elementui
集成显卡1 小时前
网页 H5 微应用接入钉钉自动登录
前端·后端·钉钉
paintstar1 小时前
el-scrollbar 获取滚动条高度 并将滚动条保持在低端
前端·学习·vue·css3