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

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

反转字符串中的单词

  • 题目
  • 思路
  • 代码

题目

在这里插入图片描述

思路

题目的难点在于首先要清除多余的空格,并且单词之间要留一个空格,首单词前和末尾单词后不能有多余空格。我们使用双指针去除所有的空格,然后在处理完一个单词后手动加一个单词。具体思路是当快指针不等于空格时,赋值给慢指针,然后快慢指针同时移动,当快指针等于空格时,慢指针不动,快指针循环移动,一直循环到不等于空格时,继续上述操作。每当处理完一个单词,此时慢指针手动加一个空格,已满足每个单词之间要有一个空格的要求。判断slow != 0,是因为开头有可能有多余的空格,此时不需要额外添加。

其次需要翻转,我们首先将s所有的字符整体翻转过来,然后逐个翻转单词。注意s的范围在0-s.size-1,而s.size()为\0。最后的for循环到s.size()是为了知道到末尾了,方便翻转最后一个单词。

代码

class Solution {
public:
    //翻转函数
    void reverse (string& s, int x, int y) {
        for (int i = x, j = y; i < j; i++, j--) {
            swap(s[i], s[j]);
        }
    }
    //删除多余的空格
    void deleteExtraSpaces (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) {
        deleteExtraSpaces(s);
        reverse(s, 0, s.size() - 1);
        int start = 0;
        for (int i = 0; i <= s.size(); i++) {
            //对每个单词翻转,到达空格或者串尾,说明一个单词结束。
            if (s[i] == ' ' || i == s.size()) {
                reverse(s, start, i - 1);
                //下一个单词开始为i+1
                start = i + 1;
            }
        }
        return s;
    }
};

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

相关文章:

  • 影刀RPA实战:网页爬虫之苦瓜书籍数据
  • 前后端分离项目--下载功能
  • 移植Linux:如何制作rootfs?
  • 相机畸变系数$b_1,b_2$与畸变系数aspect ratio和skew的互转
  • css scrollbar-width: none 隐藏默认滚动条
  • WPF DataGrid 列表中,DataGrid.Columns 列根据不同的值显示不同内容
  • MyBatis 源码解析:TypeHandler 设计与自定义实现
  • ★pwn 更改pwn题libc保姆级教程★
  • SpringBoot+Thymeleaf图书管理系统
  • Go语言并发模式详解:深入理解管道与上下文的高级用法
  • 集群聊天服务器项目【C++】项目介绍和环境搭建
  • 【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL77
  • 缓存预热方案详解
  • 论文笔记:交替单模态适应的多模态表征学习
  • WebLogic 后台弱⼝令GetShell
  • WPF入门教学四 WPF控件概述
  • opencv中读取图片、视频以及对其基本操作
  • 关系型数据库,NoSQL和内存数据库三种数据库的比较
  • OpenCV库学习之NMSBoxes函数
  • ubuntu如何进行自动mount硬盘(简易法)
  • Ansible——Playbook基本功能???
  • TortoiseSVN图标不显示的解决
  • 网页交互模拟:模拟用户输入、点击、选择、滚动等交互操作
  • 实习期间git的分枝管理以及最常用的命令
  • PyCharm 安装教程
  • C#+EmguCV合并视频文件
  • Qt Linguist 短语书批量导入翻译.ts导入.qph
  • kubernetes技术详解,带你深入了解k8s
  • 汽车应用生态系统的飞跃
  • Docker 华为云镜像加速器配置