算法力扣刷题记录 二十三【151.翻转字符串里的单词】

前言

字符串篇,继续。
记录 二十三【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 中 至少存在一个 单词

进阶:

如果字符串在你使用的编程语言中是一种可变数据类型,请尝试使用 O(1) 额外空间复杂度的 *原地* 解法。

二、尝试实现

思路

(1)对参数s应该以空格为分隔符,分割一个一个单词。
(2)流对象能够忽略空格或‘\n’,虽然读取,但是能够忽略。

用stringstream可以完成以空格分割和忽略读取到的空格。

代码实现(测试通过)

class Solution {
public:
    string reverseWords(string s) {
        string result;	//返回值
        stringstream ss(s);	//处理字符串的流对象定义。
        string str;
        while(ss>>str){	//用>>运算符可以忽略空格,以空格为分隔符
            if(result.empty()){
                result.insert(0,str);
            }else{
                result.insert(0,str+' ');	//在新string
            }  
        }
        return result;
    }
};

进阶

在原有字符串中进行解决:

进阶思路

结合记录二十二的思路,在原有string s的后面扩容,把新倒序的单词续到原有字符串的后面。最后再把前面size长度删掉,只取size之后的。

思路示意

(1)首先不能覆盖填充,因为单词不能改变,所以覆盖填充会改变原有的单词。所以就把倒序操作放到整个size的后面
(2)扩容多大区间?

  • 统计多少个字母;假设count个字母;
  • 统计一共多少个单词。假设有n个单词,需要n-1个空格。
  • 所以扩容count+n-1。在原有size的后面。
  • 总结:s.resize(size+count+n-1);

(3)接下来,翻转单词顺序。

  • 一个指针i从s[size-1]倒着往前找单词,直到s[i] != ’ '。i不再是空格;
  • 单词内的字母没有倒序,所以得找这个单词的头。用指针j=i-1开始,往前找,直到s[j] == ’ '等于空格。s[j+1]~s[i]之间是一个单词。
  • 用一个指针k记录扩容后面的位置,要把“s[j+1]~s[i]”这个单词放在哪个位置?k初始是size。从s[size]开始。
  • 空格处理:
    • 如果是倒数第一个单词,那么前面不需要有空格;如果不是倒数第一个单词,就要有空格。

代码实现(测试通过)

可以查看注释解释

class Solution {
public:
        string reverseWords(string s) {
        int size = s.size();
        int count = 0;  //统计有多少个字母
        int num = 0;    //统计多少个单词
        for(int i = 0;i < size;i++){  
            if(s[i] != ' '){	//挨个遍历原来的size,不是空格时,count可以++
                count++;
                if(i+1 < size && s[i+1]==' ' ){	//如果下一位是空格,说明是一个单词,所以num++
                    num++;
                }else if(i == size-1){	//如果s[size-1]不是空格,最后一个单词也要加上。
                    num++;
                }
            }
        }

        s.resize(size+count+num-1);//扩容
        //在扩容的区间开始翻转单词顺序
        int k = size;
        int phase = 0;
        //倒着往前找
        for(int i =size-1;i >=0;){
            if(s[i] != ' '){	//遇到一个单词的末尾字母
                int j = i-1;
                int subchar = 1;
                phase++;		//记录当前翻转的第几个单词
                for(j;j >=0;j--){	//找这个单词多长,for结束后s[j+1]是这个单词的首字母
                    if(s[j] == ' '){
                        break;
                    }
                    subchar++;	//记录单词多长
                }
                if(phase != 1){	//如果不是倒数第一个单词,在后面放单词之前先加一个空格。
                    s[k++] = ' ';
                }
                for(int m = 0;m < subchar;m++){	//单词字母没有倒转,所以正向的顺序把字母放置好。
                    s[k++] = s[j+m+1];
                }
                i = j;
                
            }
            i--;
        }
        s.erase(0,size);	//最后删除从0开始,长度为size的部分。把原有部分删除。
        return s;
    
    }
};

总结:两种方法都解决了。这种扩容可以认为是原地操作。


三、代码随想录学习

学习内容

主要看思路区别和实现区别:
(1)用split库函数,分割string s , 再用一个新字符串。C++里面没有split的函数。要么就是C风格的strtok函数,在< cstring >中,原来的string.h。
(2)因为想到reverse翻转会直接把字母翻转,就没再考虑;其实可以reverse整个string s,再把每个单词reverse回来。
(3)处理空格:多余的空格要删掉,如果不是第一个单词,前面还要留一个空格。(删除空格,也是删除元素,string可以像数组一样操作,所以用双指针法)

代码实现

class Solution {
public:
void phaseReverse(string& s,int start ,int end){	//库函数reverse使用类型iterator。
            if(start > s.size() || end < 0){
                return;
            }
            for(int i = start,j = end-1;i < j;i++,j--){ //左闭右开
                swap(s[i] ,s[j]);
            }
        }
    string reverseWords(string s) {
        //删除空格
        int fast = 0;
        int slow = 0;
        for(;fast < s.size();fast++){
            if(s[fast] != ' '){		//当遇到不该删的字符。如果没有这个判断,单词之间的空格没有删掉。
                if( slow != 0){
                    s[slow++] = ' ';//先给空格再slow++
                }
                while(fast < s.size() && s[fast] != ' '){	//必须有 < s.size() 判断,没有会越界。
                    s[slow] = s[fast];
                    fast++;
                    slow++;
                }
            }
        }

        s.resize(slow);
        reverse(s.begin(),s.end());
        //在翻转每个单词
        for(int i = 0,j = 0;j <= s.size();j++){	//因为phaseReverse左闭右开,所以j <= ,带等号。
            if(s[j] == ' ' || j == s.size()){
                phaseReverse(s,i,j);
                i = j+1;
            }
        }
        return s;
    }
};

总结

(1)用一个新string,用stringstream处理。
(2)扩容原来的string s,倒着往前找单词,放到后面,最后把前面长size的内容erase。
(3)先删除空格(双指针法),再reverse整体,再翻转某个单词。

(欢迎指正,转载表明出处)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Type-C接口OTG转接器的应用与发展

随着科技的飞速发展&#xff0c;智能移动设备已成为我们生活中不可或缺的一部分。而在这些设备的连接与数据传输中&#xff0c;Type-C接口以其高效、便捷的特性逐渐占据了主导地位。OTG&#xff08;On-The-Go&#xff09;技术则进一步扩展了Type-C接口的功能&#xff0c;使得设…

融资担保行业数字化转型探索与实践

融资担保行业数字化转型探索与实践 随着全球经济的快速发展和科技的不断进步&#xff0c;数字化转型已成为各行各业提升竞争力和实现可持续发展的必然选择。融资担保行业作为金融体系中的重要组成部分&#xff0c;也在积极探索和实践数字化转型&#xff0c;以更好地服务中小微企…

基于Datax开发支持瀚高数据库的插件_插件开发_以及部署---国产瀚高数据库工作笔记006

如果想直接使用,开发好的插件,那么可以去下载笔者上传的,打包好的插件,直接放入到 datax安装目录的./datax/plugin/reader 或者writer中就可以了 https://download.csdn.net/download/lidew521/89495306 https://download.csdn.net/download/lidew521/89495301这两个一个…

多功能引流必备神器!评论区关键词采集!斗音平台引流

大家好我今天带来的这款软件&#xff0c;就像是抖音引流界的“多功能引流神器”&#xff0c;功能全面到让你眼花缭乱&#xff0c;而且操作简便到连你的宠物金鱼都能学会&#xff01; 下面开看看都有哪些功能​&#xff1a; 高级截流拓客功能&#xff1a;想象一下&#xff0c;你…

性能之巅的巴比达内网穿透访问单位的web管理系统

在这个数字化飞速发展的时代&#xff0c;作为一名IT部门的小主管&#xff0c;我经常面临着一项挑战&#xff1a;如何在外网环境下高效、安全地访问我们单位内部部署的Web管理系统。这不仅仅是关乎我个人的工作效率&#xff0c;更是影响到整个团队能否快速响应市场需求的关键。直…

昇思MindSpore学习笔记1--基本介绍

昇思MindSpore是一个全场景深度学习框架。 一、框架组成 1. 模型库ModelZoo 提供深度学习算法网络。 2. 扩展库MindSpore Extend 拓展领域场景&#xff0c;如GNN/深度概率编程/强化学习等。 3. 科学计算MindSpore Science 科学计算套件。 包含数据集、基础模型、预置高精度模…

抖音微短剧小程序源码搭建:实现巨量广告数据高效回传

在数字化营销日益盛行的今天&#xff0c;抖音微短剧小程序已成为品牌与观众互动的新渠道。这些短小精悍的剧目不仅能迅速抓住用户的注意力&#xff0c;还能有效提升品牌的知名度和用户黏性。然而&#xff0c;想要充分利用这一营销工具&#xff0c;关键在于如何高效地追踪广告数…

力扣 移除元素

class Solution {public int removeElement(int[] nums, int val) {int left 0;for(int right 0;right<nums.length;right){if(nums[right] ! val){nums[left] nums[right];left;}}return left;} }

实验八 T_SQL编程

题目 以电子商务系统数据库ecommerce为例 1、在ecommerce数据库&#xff0c;针对会员表member首先创建一个“呼和浩特地区”会员的视图view_hohhot&#xff0c;然后通过该视图查询来自“呼和浩特”地区的会员信息&#xff0c;用批处理命令语句将问题进行分割&#xff0c;并分…

[leetcode]insert-into-a-binary-search-tree

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:TreeNode* insertIntoBST(TreeNode* root, int val) {if (root nullptr) {return new TreeNode(val);}TreeNode* pos root;while (pos ! nullptr) {if (val < pos->val) {if (pos->left nullptr…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于改进目标级联分析法的交直流混联系统发电-备用分布式协同调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Python 提取图片主色调

Python 提取图片主色调 效果代码编写 效果 有个要提取图片主色调的需求&#xff0c;记录一下。 代码编写 import numpy as np import cv2 from sklearn.cluster import KMeans from skimage.color import rgb2lab, deltaE_cie76 from collections import Counter# 创建默认…

OpenAI禁止中国使用API,国内大模型市场何去何从

GPT-5 一年半后发布&#xff1f;对此你有何期待&#xff1f; 前言 前言&#xff1a; 近日&#xff0c;OpenAI宣布禁止中国用户使用其API&#xff0c;这一决策引起了国内大模型市场的广泛关注。面对这一挑战&#xff0c;国内大模型市场的发展路径和前景成为业界热议的焦点。本…

收银系统源码-千呼新零售【分销商城】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货、宠物等连锁店使用。 详细介绍请…

C# 实现websocket双向通信

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C# &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff…

关于新零售的一些思考

本文作为2024上半年大量输入之后的核心思考之一。工作到一定阶段之后&#xff0c;思考的重要性越来越高&#xff0c;后续会把自己的个人思考记录在这个新系列《施展爱思考》。背景是上半年面临业务转型从电商到新零售&#xff0c;本文是相关大量输入之后的思考&#xff0c;对新…

还在用 Jenkins?快来试试这款简而轻的自动化部署工具吧!

文章目录 项目介绍功能特性效果展示逻辑节点仓库信息构建列表SSH 管理 安装使用一键安装命令管理 Jpom 服务端防火墙配置 相关地址总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#x…

Altium Designer的元件库 PCB库 3D库神器

元件库 PCB库 3D库神器 对于硬件工程师来说贸泽是一个器件选型相当方便的电子商城,虽然购买元器件比立创商城要慢和贵,但是,上面的物料种类、选型的便捷性要远远好于立创商城;而且,它上面的大多数元件都有自己的元件封装、PCB封装、3D模型,这就对实际的开发节省了好多绘…

LangChain E-Mails with LLM

题意&#xff1a;通过LangChain使用大型语言模型&#xff08;LLM&#xff09;处理电子邮件 问题背景&#xff1a; I am quite new to LangChain and Python as im mainly doing C# but i am interested in using AI on my own data. So i wrote some python code using langch…

springboot系列八: springboot静态资源访问,Rest风格请求处理, 接收参数相关注解

文章目录 WEB开发-静态资源访问官方文档基本介绍快速入门注意事项和细节 Rest风格请求处理基本介绍应用实例注意事项和细节思考题 接收参数相关注解基本介绍应用实例PathVariableRequestHeaderRequestParamCookieValueRequestBodyRequestAttributeSessionAttribute ⬅️ 上一篇…