力扣 151. 反转字符串中的单词

news2024/11/24 14:41:53

一、题目描述

给你一个字符串 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"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

二、题解

首先通过快慢指针将字符串中的所有多余的空格去除(类似于删除字符串中指定字符),去除空格后逆置整个句子再依次逆置每个单词,时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:
    string reverseWords(string s) {
        /* 通过快慢双指针去除多余空格 */
        int fast = 0, slow = 0;
        /* 去除前导空格 */
        while (s.at(fast) == 32) {
            fast++;
        }
        /* 去除中间的多余空格 */
        while (fast < s.size()) {
            while (fast < s.size() - 1 && s.at(fast) == 32 && s.at(fast + 1) == 32) {
                fast++;
            }
            s.at(slow++) = s.at(fast++);
        }
        /* 去除尾随空格 */
        if (s.at(slow - 1) == 32) {
            s.resize(slow - 1);
        } else {
            s.resize(slow);
        }

        /* 逆置整个句子,然后逆置每个单词 */
        reverse(s.begin(), s.end());
        int begin = 0, end = 0;
        while (end < s.size()) {
            if (end + 1 == s.size() || s.at(end + 1) == 32) {
                reverseSingleWord(s, begin, end);
                cout << begin << " " << end << endl;
                begin = end + 2;
                end = begin;
            } else {
                end++;
            }
        }

        return s;
    }

private:
    void reverseSingleWord(string &s, int begin, int end) {
        for (int i = begin, j = end; i < j; i++, j--) {
            char tmp = s.at(i);
            s.at(i) = s.at(j);
            s.at(j) = tmp;
        }
    }
};

在这里插入图片描述

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

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

相关文章

内存分段详解

内存分段 1.1 分段机制概述 1.1.1 分段机制产生的原因 对于分段机制&#xff0c;要从Intel的微处理器的8086开始说起&#xff0c;刚开始内存空间比较小&#xff0c;内存寻址采用的是直接访问物理地址的方式。由于技术的发展&#xff0c;计算机做的事情越来越多&#xff0c;程…

Connection closed, EOF detected错误

生产遇到了这个问题 原因&#xff1a;两个http网址&#xff0c;即没有启用SSL 解决方案 在 weblogic的启动文件 bin里面 的 setDomainEnv.sh 这个文件 。 加上这一句 set JAVA_OPTIONS%JAVA_OPTIONS% -DUseSunHttpHandlertrue

IS230STAOH2A开关柜的基本特征是什么以及开关柜如何用于电力系统的保护

​ IS230STAOH2A开关柜的基本特征是什么以及开关柜如何用于电力系统的保护 什么是开关柜 开关设备是用于开关控制和保护电路和设备的装置&#xff0c;电力在我们现代文明中的重要性非常高&#xff0c;因此为了获得持续的电力&#xff0c;我们必须确保电力系统免受大故障的影响…

电脑死机的常用排查思路

在工作过程中难免会遇到死机的问题&#xff0c;排查起来并不是那么轻松&#xff0c;下面分享一下我排查死机问题的思路。 判断是软件还是硬件级别的故障 在死机时先尝试移动鼠标&#xff0c;按大小写切换键或数字键盘锁定键&#xff0c;看看光标是否可以移动&#xff0c;大小…

LabVIEWCompactRIO 开发指南15 托管和监控网络发布的共享变量

LabVIEWCompactRIO 开发指南15 托管和监控网络发布的共享变量 托管 要使用网络发布的共享变量&#xff0c;共享变量引擎必须在分布式系统中的至少一个节点上运行。网络上的任何节点都可以读取或写入共享变量引擎发布的共享变量。所有节点都可以在不安装共享变量引擎的情况下…

【C语言】有符号整型(int) 与 无符号整型(unsigned int)的运算

/*有符号整型(int) 与 无符号整型(unsigned int)的运算1.全局变量&#xff0c;静态变量都是放在静态区&#xff0c;不初始化的时候&#xff0c;默认值为0。局部变量&#xff0c;放在栈区&#xff0c;不初始化的时候&#xff0c;默认值是随机值,编译器会报错2.int 与 unsigned i…

Linux知识点 -- Linux权限

Linux知识点 – Linux权限 文章目录 Linux知识点 -- Linux权限一、shell命令及运行原理二、Linux权限1.概念2.文件类型和访问权限3.更改文件的权限4.没有权限的情况5.更改文件的拥有者和所属组6.添加用户到信任列表7.umask权限掩码8.粘滞位 一、shell命令及运行原理 Linux严格…

【头歌】数组-稀疏矩阵的转置

数组-稀疏矩阵的转置 第1关&#xff1a;一般转置算法 任务描述 本关任务&#xff1a;实现稀疏矩阵的转置操作&#xff08;采用一般转置算法&#xff0c;即按列序转置&#xff09;。 相关知识 为了完成本关任务&#xff0c;你需要理解&#xff1a;1. 矩阵的压缩存储&#x…

np读取txt、csv文件的数据

目录 1、基础参数 2、参数详解 3、应用参数示例 机器学习中使用np.loadtxt()可以高效的导入数据&#xff0c;np.loadtxt()适合.txt文件和.csv文件。但是它默认读取float类型的值。 1、基础参数 numpy.loadtxt(fname, dtype, comments#, delimiterNone, convertersNone, s…

11. 类的继承

一、为什么要用继承 一个简化的Student类 class Student { private:string name;string studentID; public:string getName(){ return name; }void setName(string newName) { name newName; }string getStudentID(){ return studentID; }void setStudentID(string newID) {…

操作系统基础知识介绍之内存技术和优化(一)(包含SRAM和DRAM、SDRAM、GDRAMs)

使用 SRAM 可以满足最小化高速缓存访​​问时间的需要。 然而&#xff0c;当缓存未命中时&#xff0c;我们需要尽快将数据从主存中移出&#xff0c;这就需要高带宽内存。 这种高内存带宽可以通过将构成主内存的许多 DRAM 芯片组织成多个内存条并使内存总线更宽来实现&#xff0…

数字孪生可视化开发工具在各行业中的应用

数字孪生就是指在信息化平台内模拟物理实体、流程或者系统&#xff0c;即打造一个现实场景的数字化孪生双胞胎。出于成本和周期考虑&#xff0c;快速低成本搭建数字孪生系统成为中小型企业的期望&#xff0c;深圳华锐视点研发的UE4数字孪生编辑器&#xff0c;是一种能够帮助用户…

【Shell脚本】Linux安装Nginx以及开机自启

目录 一、Linux安装Nginx脚本1、把编写好的安装Nginx脚本放置到nginx.sh文件中2、在检查网络的时候&#xff0c;这里的IP地址&#xff0c;填写的需要安装Nginx服务器的IP地址3、这里的端口号可按照自己的需要进行修改4、安装Nginx脚本 二、Nginx开机自启 一、Linux安装Nginx脚本…

API网关|JD|pinduoduoAPI接入

API网关是什么 在日常工作中&#xff0c;不同的场合下&#xff0c;我们可能听说过很多次网关这个名称&#xff0c;这里说的网关特指API网关&#xff08;API Gataway&#xff09;。字面意思是指将所有API的调用统一接入API网关层&#xff0c;由网关层负责接入和输出。 那么在什…

相遇于此,“相交链表”问题的两种思路

本篇博客会讲解力扣“160. 相交链表”的解题思路&#xff0c;这是题目链接。 老规矩&#xff0c;先来审题。这道题的题干有点长&#xff0c;简而言之&#xff0c;就是判断2个链表是否相交&#xff0c;如果相交就返回第一个相交结点&#xff0c;不相交就返回NULL。看看题目原文…

轻松打造完美客户服务系统,这4个关键点不容错过

客户服务对于一个企业来说非常重要&#xff0c;有以下几个原因&#xff1a; 1、建立客户忠诚度&#xff1a;通过提供高质量的客户服务&#xff0c;可以增加客户满意度和忠诚度。这将有助于企业保持竞争优势并吸引新客户。 2、提高客户满意度&#xff1a;客户对企业的服务感到…

MySQL 升级到 8.0 变慢问题分析

1. 背景介绍 前段时间&#xff0c;客户线上 MySQL 版本从 5.7.29 升级到 8.0.25。 升级完成之后&#xff0c;放业务请求进来&#xff0c;没到一分钟就开始出现慢查询&#xff0c;然后&#xff0c;慢查询越来越多&#xff0c;业务 SQL 出现堆积。 整个过程持续了大概一个小时&…

Java学习笔记 --- Stream流

一、体验Stream流【理解】 案例需求 按照下面的要求完成集合的创建和遍历 创建一个集合&#xff0c;存储多个字符串元素 把集合中所有以"张"开头的元素存储到一个新的集合 把"张"开头的集合中的长度为3的元素存储到一个新的集合 遍历上一步得到的集合 …

使用群晖NAS Mail Server搭建个性化邮件系统

准备工作 一个顶级域名可以获取公网IP的宽带路由使用DDNS功能&#xff0c;或使用群晖自带DDNS&#xff0c;解析顶级域名可以做“端口映射”的路由器 搭建开始 step1&#xff1a;安装套件 登录群晖NAS&#xff0c;打开[套件中心]&#xff0c;搜索“mail”&#xff0c;安装如…

idea-easyYapi的使用

链接: EasyYapi官方文档. 网上搜到的easyYapi基本上都是千篇一律&#xff0c;比较浅&#xff0c;稍微有点定制的东西都搜不到&#xff0c;帮此把自己的一些心得写出来&#xff0c;后续有新发现也会继续更新 第一步&#xff1a;安装插件 第二步&#xff1a;配置数据 yapi的t…