【LeetCode】151. 反转字符串中的单词 - 双指针

news2025/2/22 0:53:54

目录标题

  • 2023-8-22 09:53:10
    • 原始
    • 优化

151. 反转字符串中的单词

2023-8-22 09:53:10

也是想到了快慢指针的思想。

原始

class Solution {
    public String reverseWords(String s) {
        int length = s.length();
        Integer pre = null;
        Integer last = null;
        StringBuilder stringBuilder = new StringBuilder("");
        for (int i = length - 1; i >= 0; i--) {
            // 如果是字母第一次出现
            if (s.charAt(i) != ' ') {
                // 记录单词尾部指针的位置
                if (last == null) {
                    last = i;
                }
            }
            // 字母已经出现过一次,并且又找到了空格,表示,我们已经找到了一个单词了
            else if (last != null) {
                // 记录单词首部指针的位置
                pre = i;
            }

            // 单词首部指针  和 单词尾部指针 已经找到了
            if (last != null && pre != null) {
                // 满足 "单词间应当仅用单个空格分隔"
                if (!stringBuilder.toString().equals("")) {
                    stringBuilder.append(" ");
                }
                // 添加单词
                // 以"the sky is blue" 为例子,由于 substring 的语法特性
                // last 应为 'e'的下标14;pre 应为 ' '的下标10,也就是 10-14的区间是' blue'
                String substring = s.substring(pre + 1, last + 1);
                stringBuilder.append(substring);
                pre = null;
                last = null;
            }
        }

        // 这一步是因为由于 以"the sky is blue" 为例子
        // 考虑到这种情况:  last 应为 'e'的下标2, 但是pre 是空的
        // 也就是 0-2的区间是'the' 也需要加上
        // " hello world " 这种首部为 空格就不需要考虑了,因为 last 应为null的
        if (last != null) {
            if (stringBuilder.toString() != "") {
                stringBuilder.append(" ");
            }
            // 截取 0-2的区间 的区间
            String substring = s.substring(0, last + 1);
            stringBuilder.append(substring);
        }
        return stringBuilder.toString();
    }
}

在这里插入图片描述

优化

class Solution {
    public String reverseWords(String s) {
        s = s.trim();                                    // 删除首尾空格
        int j = s.length() - 1, i = j;
        StringBuilder res = new StringBuilder();
        while (i >= 0) {
            while (i >= 0 && s.charAt(i) != ' ') i--;     // 搜索首个空格
            res.append(s.substring(i + 1, j + 1) + " "); // 添加单词
            while (i >= 0 && s.charAt(i) == ' ') i--;     // 跳过单词间空格
            j = i;                                       // j 指向下个单词的尾字符
        }
        return res.toString().trim();                    // 转化为字符串并返回
    }
}

作者:Krahets
链接:https://leetcode.cn/problems/reverse-words-in-a-string/solutions/2361551/151-fan-zhuan-zi-fu-chuan-zhong-de-dan-c-yb1r/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/911528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode--HOT100题(38)

目录 题目描述:226. 翻转二叉树(简单)题目接口解题思路代码 PS: 题目描述:226. 翻转二叉树(简单) 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 LeetCode做题链…

Power apps:做个简单的扫码应用

Power apps的扫码应用只能客户端使用 一、创建一个窗口"扫码APP”,插入媒体工具“条形码读卡器” 二、如果需要在扫码时做一个动作,可以设置它的属性,比如跳转窗口之类的 三、添加一个文本标签,实现在扫码后标签显示条形码&#xff08…

(三)行为模式:5、中介者模式(Mediator Pattern)(C++示例)

目录 1、中介者模式(Mediator Pattern)含义 2、中介者模式的UML图学习 3、中介者模式的应用场景 4、中介者模式的优缺点 (1)优点 (2)缺点 5、C实现中介者模式的实例 1、中介者模式(Media…

数字图像处理—— Lab、YCbCr、HSV、RGB之间互转

Lab “Lab” 图像格式通常指的是 CIELAB 色彩空间,也称为 Lab 色彩空间。它是一种用于描述人类视觉感知的颜色的设备无关色彩空间,与常见的 RGB 和 CMYK 色彩空间不同。CIELAB 由国际照明委员会(CIE)于1976年定义,用于…

工业生产全面感知!工业感知云来了

面向工业企业数字化转型需求,天翼物联基于感知云平台创新能力和5G工业物联数采能力,为客户提供工业感知云服务,包括工业泛协议接入、感知云工业超轻数采平台、工业感知数据治理、工业数据看板四大服务,构建工业感知神经系统新型数…

MySQL分页查询-性能优化

MySQL分页查询优化 一、背景二、原因三、原理分析 https://blog.csdn.net/hollis_chuang/article/details/130570281 一、背景 业务背景:给C端10万级别的用户,同时发送活动消息,活动消息分为6类。数据背景:mysql表有百万级别的数…

学习微服务必推荐的天花板级别微服务架构笔记

有没有一本讲微服务架构比较不错的书? 貌似关于架构设计的书没有人推荐?有没有人推荐一本,最好是有关架构演变的也有相关介绍 小编就在这里推荐一份Chris Richardson写的《微服务架构设计模式》,他本人是微服务领域的专家&#xf…

常见前端面试之VUE面试题汇总二

4. slot 是什么?有什么作用?原理是什么? slot 又名插槽,是 Vue 的内容分发机制,组件内部的模板引擎使用 slot 元素作为承载分发内容的出口。插槽 slot 是子组件的一个模板 标签元素,而这一个标签元素是否显…

【Linux】网络层协议:IP

一片赤胆平乱世,手中长枪定江山 文章目录 一、IP和TCP之间的关系(提供策略 和 提供能力)二、IP报头的理解(再次理解面向数据报)三、网段划分1.为什么要进行网段划分?(方便定位目标主机&#xff…

21 移动测试神器:带你玩转Appium

Appium特点 Appium 作为目前主流的移动应用自动化测试框架,具有极强的灵活性,主要体现在以下 5 个方面: 测试用例的实现支持多种编程语言,比如 Java、Ruby、Python 等; Appium Server 支持多平台,既…

ChatGPT帮助提升工作效率和质量:完成时间下降40%,质量评分上升 18%

自ChatGPT去年11月发布以来,人们就开始使用它来协助工作,热心的用户利用它帮助撰写各种内容,从宣传材料到沟通话术再到调研报告。 两名MIT经济学研究生近日在《科学》杂志上发表的一项新研究表明,ChatGPT可能有助于减少员工之…

【三维重建】【深度学习】NeuS代码Pytorch实现--测试阶段代码解析(上)

【三维重建】【深度学习】NeuS代码Pytorch实现–测试阶段代码解析(上) 论文提出了一种新颖的神经表面重建方法,称为NeuS,用于从2D图像输入以高保真度重建对象和场景。在NeuS中建议将曲面表示为有符号距离函数(SDF)的零级集,并开发一种新的体绘…

前馈神经网络解密:深入理解人工智能的基石

目录 一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函数与优化算法反向传播算法详解避免过拟合的策略 四、使用Python…

SVM详解

公式太多了,就用图片用笔记呈现,SVM虽然算法本质一目了然,但其中用到的数学推导还是挺多的,其中拉格朗日约束关于α>0这块证明我看了很长时间,到底是因为悟性不够。对偶问题也是,用了一个简单的例子才明…

超级计算机

超级计算机是一种高性能计算机,它能够以极高的速度执行大规模的计算任务。超级计算机通常由数千个甚至数百万个处理器组成,这些处理器能够同时处理大量的数据,从而实现高效的计算。超级计算机广泛应用于科学、工程、金融、天气预报等领域&…

shell的变量

一、什么是变量 二、变量的命名 三、查看变量的值 env显示全局变量,刚刚定义的root_mess是局部变量 四、变量的定义 旧版本(7、8四个文件都加载)和新版本(9只加载两个etc)不一样,所以su - 现在要永久生效在…

IIS缺少MIME类型配置导致404错误

最近程序准备发布到测试服务器供用户端测试,公司提供的测试环境竟是Windows Server 2008 R2 Enterprise IIS 7.5 由于程序引用了fontawesome字体库,发布后浏览发现库中引用的woff、woff2均返回404错误: 前期本地测试以及本地IIS 10并无出现该…

Java“牵手”拼多多产品详情接口API-产品SKU,价格,优惠券,图文介绍,拼多多API接口实现海量商品采集

拼多多是中国的一家电子商务平台,以团购模式为主,成立于2015年。拼多多的宝贝详情页是指在商品页面上展示商品信息和图片的区域,是用户了解和购买商品的重要窗口。下面就让我们来全面解析拼多多宝贝详情页,帮助你更好地了解商品信…

2023-08-21 LeetCode每日一题(移动片段得到字符串)

2023-08-21每日一题 一、题目编号 2337. 移动片段得到字符串二、题目链接 点击跳转到题目位置 三、题目描述 给你两个字符串 start 和 target ,长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成,其中: 字符 ‘L’ 和 ‘R…

电脑运行缓慢?4个方法,加速电脑运行!

“我电脑才用了没多久哎!怎么突然就变得运行很缓慢了呢?有什么方法可以加速电脑运行速度吗?真的很需要,看看我吧!” 电脑的运行速度快会让用户在使用电脑时感觉愉悦,而电脑运行缓慢可能会影响我们的工作效率…