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

代码随想录二刷 |字符串 |翻转字符串里的单词

代码随想录二刷 |字符串 |翻转字符串里的单词

  • 题目描述
  • 解题思路 & 代码实现
    • 移除多个空格
    • 将整个字符串翻转
    • 将每个单词翻转

题目描述

151.翻转字符串里的单词

给你一个字符串 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 中 至少存在一个 单词

解题思路 & 代码实现

  • 移除多余空格
  • 将整个字符串翻转
  • 将每个单词翻转

移除多个空格

这一步与27.移除多余元素的逻辑是一样的,使用双指针删除空格,将快指针指向的元素赋给慢指针,相当于重新塑造一个字符串,也就是说,快指针只找字母,不找空格,再将找到的字母赋给慢指针,最后返回慢指针的长度的字符串,这样就做到了在原地删除空格:

void removeExtraSpaces(string& s) {int slow = 0;for (int fast = 0; fast < s.size(); fast++) {if (s[fast] != ' ') { // fast不指向空格// slow != 0 说明已经不是第一个字母了,需要加一个空格// 也就是说在单词之间添加空格if (slow != 0) s[slow++] = ' ';// 快指针指向的字母都赋给慢指针while (fast < s.size() && s[fast] != ' ') {s[slow++] = s[fast++];}}}// 最后返回slow长度的字符串即可。s.resize(slow);}

将整个字符串翻转

也是使用双指针,一个指针指向头,一个指针指向尾,两个指针都向中间移动,同时交换指针指向的元素

void reverse(string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {swap(s[i], s[j]);}}	

将每个单词翻转

这时已经去掉了多余的空格,并且将整个字符串翻转了,这时需要将每个单词翻转,再次使用之前写好的翻转函数即可,只不过这次要让一个指针i在循环中移动时,让i指向空格的时候进行翻转,同时还要让end = i - 1, 因为当i指向空格时,i-1指向的元素就是需要翻转的单词了。

在完成一个单词的翻转后,start要到i的前面去,也要指向一个单词,这样就可以继续翻转了。

int start = 0;
for (int i = 0; i < s.size(); ++i) {if (i = size() || i = ' ') {reverse(s, start, i - 1);start = i + 1;}
}

完整代码如下:

class Solution {
public:// 翻转函数void reverse(string& s, int start, int end) {for (int i = start, j = end; i < j; i++, j--) {swap(s[i], s[j]);}}	// 去除多余空格void removeExtraSpaces(string& s) {int slow = 0;for (int fast = 0; fast < s.size(); fast++) {if (s[fast] != ' ') {if (slow != 0) s[slow++] = ' ';while (fast < s.size() && s[fast] != ' ') {s[slow++] = s[fast++];}}}s.resize(slow);}// 翻转每个单词string reverseWords(string s) {removeExtraSpaces(s);reverse(s, 0, s.size() - 1);int start = 0;for (int i = 0; i <= s.size(); ++i) {if (i == s.size() || s[i] == ' ') {reverse(s, start, i - 1);start = i + 1;}}return s;}
};

相关文章:

代码随想录二刷 |字符串 |翻转字符串里的单词

代码随想录二刷 &#xff5c;字符串 &#xff5c;翻转字符串里的单词 题目描述解题思路 & 代码实现移除多个空格将整个字符串翻转将每个单词翻转 题目描述 151.翻转字符串里的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成…...

低调使用。推荐一个 GPT4 Turbo、Vision、GPTs、DELL·E3 等所有最新功能同步可用国内网站

在 11 月 6 日&#xff0c;万众期待的 OpenAI DevDay&#xff0c;ChatGPT 发布了一系列新的产品&#xff0c;其中推出了 GPT4 Turbo&#xff0c;并且将GPT4 Vision&#xff0c;DELLE3 等等能力全部集合到一起&#xff0c;不需要再分开使用&#xff0c;原来的局限的文本聊天也进…...

基于视觉传感器的自主扫雷机器人设计与实现

摘要&#xff1a; 在当今的世界安全形势下&#xff0c;扫雷小车的出现可以减少各国人员在扫雷过程中的人员伤亡&#xff0c;扫雷小车实用性能强更适合在军事化领域或者是民用领域上应用。让它具有光明的发展前景。针对这一情况&#xff0c;本毕业设计就对自主扫雷小车进行研究…...

计算机新建盘符和重新分配盘符的大小

一、新建盘符 有些电脑刚买来时候&#xff0c;只有一个C盘分区&#xff0c;此时最好增加几个分区方便使用。 注意&#xff1a;分区操作要慎重&#xff0c;不要轻易去试。这里只针对购买的电脑厂家未做分区&#xff0c;只有一个C盘的情况。 如果自己电脑的分区本身已经满足你…...

windows 查看mysql的错误日志

查找错误日志文件存储路径 用到的软件&#xff1a;everything 官网 voidtools 下载路径 https://www.voidtools.com/Everything-1.4.1.1024.x64-Setup.exe 直接点击下载即可 运行效果如下 我们知道mysql有个配置文件是my.ini&#xff0c;里面配置了相关信息 我们需要先…...

java多线程CountDownLatch简单测试

学习java多线程&#xff0c;请同时参阅 Java多线程 信号量和屏障实现控制并发线程数量&#xff0c;主线程等待所有线程执行完毕1 CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后再继续执行。当所有的线程都已经完成任务&#xff0c;然后在CountDownLatch上…...

npm,yarn,pnpm 清理缓存

目录 1&#xff0c;为什么要清理缓存1&#xff0c;缓存文件太多&#xff0c;影响系统运行2&#xff0c;不同源会有区别 2&#xff0c;命令2.1&#xff0c;npm2.2&#xff0c;yarn2.3&#xff0c;pnpm 1&#xff0c;为什么要清理缓存 1&#xff0c;缓存文件太多&#xff0c;影响…...

【数据结构】二叉排序树(c风格、结合c++引用)

目录 1 基本概念 结构体定义 各种接口 2 二叉排序树的构建和中序遍历 递归版单次插入 非递归版单次插入 3 二叉排序树的查找 非递归版本 递归版本 4 二叉排序树的删除&#xff08;难点&#xff09; 1 基本概念 普通二叉排序树是一种简单的数据结构&#xff0c;节点的值…...

SpringCloudSleuth+Zipkin 整合及关键包汇总

背景 整合了一下 SpringCloudSleuth Zipkin&#xff0c;本来是很简单的东西&#xff0c;但是最终导出依赖包时没注意&#xff0c;导致目标服务始终没有被纳入 Zipkin 的链路追踪中&#xff0c;本文记录这个过程及关键依赖包。 部署zipkin 官网下载最新的 zipkin 可执行包&a…...

腾讯面试笔试题2023.11.30

给定一个由整数组成的非空数组所表示的非负整数如[1,2,3]&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 &#xff08;要求只能操作数组&#xff0c;不…...

cesium 融合视频

0 如果是文件&#xff0c;那相当的简单 和untiy 一样&#xff0c;可以添加材质后&#xff0c;将image 直接给材质赋值上&#xff0c;其中abcd 是四个点&#xff0c;这四个点要经过计算 <video id"video" style"display:none" controls loop autoplay&…...

微信小程序踩坑记录

一、引言 作者在开发微信小程序《目的地到了》的过程中遇到过许多问题&#xff0c;这里讲讲一些技术和经验问题。 基本目录机构&#xff1a; 二、问题 1、定位使用 获取定位一定要在app.json里面申明&#xff0c;不然是没办法获取定位信息的 "requiredPrivateInfos"…...

H5 uniapp 接入wx sdk

uniapp因为要兼容小程序等&#xff0c;会重写wx对象&#xff0c;导致引入的jweixin-1.6.0.js中对象不生效。 综合网络资料&#xff0c;有两种解决方案&#xff1a; 一&#xff0c;通过npm工具引入 npm install jweixin-module --save 实际上是借用了wx的另一个对象jWeixin …...

ubuntu离线安装包

方便快捷方式 查看依赖 apt-cache depends 包名(gcc或language-pack-zh-hans)下载deb及其依赖包 # 下载.deb包到指定目录 cd /var/cache/apt/archives apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-repl…...

电脑如何录音?适合初学者的详细教程

“电脑怎么录音呀&#xff1f;参加了一个学校举办的短视频大赛&#xff0c;视频拍摄都很顺利&#xff0c;音乐却出了问题&#xff0c;朋友说可以用电脑录制一段音乐应付一下&#xff0c;可是我不会操作&#xff0c;有哪位大佬教教我&#xff01;” 声音是一种强大的媒介&#…...

从零开始的C++(二十)

哈希&#xff1a; 用于unorder_map和unorder_set&#xff0c;其本身是一种思想&#xff0c;即通过一个值利用某种算法去映射到另一个值上。利用哈希思想具体实现的是哈希表。 哈希通常函数&#xff1a;插入和查找 1.插入&#xff1a;用某种算法算出插入值对应的插入下标。 …...

shell编程系列(8)-使用sed处理文本

文章目录 引言sed用法详解在文本中定位打印文本替换文本删除文本新增文本 结语 引言 在日常工作学习中我们都会遇到要编辑文本的场景&#xff0c;例如我们要用vim或者nano等命令去编辑代码&#xff0c;处理文本文件等&#xff0c;这些命令的特点都是需要我们进行交互式的实时处…...

NDK是什么?有什么用?需要掌握什么技术栈?

文章目录 NDK使用NDK的优点使用NDK需要掌握的知识C/C的编译原理C/C基本语法和编写能力原生共享库&#xff1a;原生静态库&#xff1a;Java 原生接口 (JNI)&#xff1a;应用二进制接口 (ABI)&#xff1a; CMakeLLDB参考 NDK NDK&#xff08;Native Development Kit&#xff0c;…...

《代码长寿经:程序员养生指南》

嘿&#xff0c;代码海洋的航行者们&#xff01;你们是否有过熬夜加班后&#xff0c;头发渐渐稀疏、眼镜度数直线上升&#xff0c;还不小心多了几斤“编码赘肉”的经历&#xff1f;程序员这个行业&#xff0c;似乎人均亚健康&#xff0c;有人戏称程序员的职业发展路径是&#xf…...

统计素数并求和(Python)

题目描述 统计素数并求和 本题要求统计给定整数 M M M 和 N N N 区间内素数的个数并对它们求和。 输入格式: 输入在一行中给出两个正整数 M M M 和 N ( 1 ≤ M ≤ N ≤ 500 ) N(1≤M≤N≤500) N(1≤M≤N≤500)。 输出格式: 在一行中顺序输出 M M M 和 N N N 区间内…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南&#xff1a;计算机基础与源码原理深度解析 第一轮提问&#xff1a;基础概念问题 1. 请解释什么是进程和线程的区别&#xff1f; 面试官&#xff1a;进程是程序的一次执行过程&#xff0c;是系统进行资源分配和调度的基本单位&#xff1b;而线程是进程中的…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例

目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码&#xff1a;冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...