(字符串 ) 151. 反转字符串中的单词 ——【Leetcode每日一题】

news2025/1/9 9:56:00

❓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 . l e n g t h < = 1 0 4 1 <= s.length <= 10^4 1<=s.length<=104
  • s 包含英文大小写字母数字和空格 ' '
  • s 中 至少存在一个 单词

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

💡思路:

不使用辅助空间,那么只能在原字符串数组上下功夫了。

我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了:

  1. 移除多余空格;(一个erase本来就是 O ( n ) O(n) O(n)的操作, 所以这里使用快慢指针 平移,然后resize())
  2. 将整个字符串反转;
  3. 将每个单词反转。

🍁代码:(Java、C++)

Java

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = new StringBuilder();
        int start = 0, end = s.length() - 1;
        while(s.charAt(start) == ' ') start++;
        while(s.charAt(end) == ' ') end--;
        while(start <= end){//删除空格
            char c = s.charAt(start);
            if(c != ' ' || sb.charAt(sb.length() - 1) != ' ') sb.append(c);
            start++;
        }
        sb.reverse();//整个字符串反转

        int n = sb.length();
        start = 0;
        for(int i = 0; i < n; i++){//反转每个单词
            while(i < n && sb.charAt(i) != ' ') i++;
            end = i - 1;
            while(start < end){
                char c = sb.charAt(start);
                sb.setCharAt(start, sb.charAt(end));
                sb.setCharAt(end, c);
                start++;
                end--;
            }
            start = i + 1;
        }
        return sb.toString();
    }
}

C++

class Solution {
public:
    string reverseWords(string s) {
        int slow = 0;
        for(int i = 0; i < s.size(); ++i){
            if(s[i] != ' '){//遇到非空格就处理,即向前移动,以删除所有空格
                if(slow != 0) s[slow++] = ' ';//在单词前添加空格
                while(i < s.size() && s[i] != ' '){//补上该单词,遇到空格说明单词结束
                    s[slow++] = s[i++];
                }
            }
        }
        s.resize(slow);slow的大小即为去除多余空格后的大小
        reverse(s.begin(), s.end());//整个字符串反转
        
        for(int start = 0, i = 0; i <= s.size(); i++){//反转每个单词
            if(s[i] == ' ' || i == s.size()){
                reverse(s.begin() + start, s.begin() + i);
                start = i + 1;
            }
        }
        return s;
    }
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ) O(n) O(n),其中 n 为输入字符串的长度。
  • 空间复杂度 O ( 1 ) O(1) O(1) O ( n ) O(n) O(n),取决于使用的语言中字符串类型的性质。如果字符串是可修改的(C++),那么我们可以直接在原字符串上修改,空间复杂度为 O ( 1 ) O(1) O(1),(Java)否则需要使用 O ( n ) O(n) O(n) 的空间将字符串临时转换为可以修改的数据结构(例如数组),空间复杂度为 O ( n ) O(n) O(n)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

面向对象编程 实验三 sduwh 子窗口与控件的基本用法、资源的使用 参考实验报告1

源自网络收集&#xff0c;仅供参考 实验三收集到两份完整报告&#xff0c;这是其一&#xff0c;另一份见本专栏下一篇文章。 实验题目 《面向对象程序设计》 实验三 实验题目&#xff1a;子窗口与控件的基本用法、资源的使用 整体目的&#xff1a;理解、窗口之间的消息传送…

DAY08_JavaScrip

目录 1 JavaScript1.1 JavaScript简介1.2 JavaScript引入方式1.2.1 内联脚本1.2.2 内部脚本1.2.3 外部脚本 1.3 JavaScript基础语法1.3.1 书写语法1.3.2 输出语句1.3.3 变量1.3.4 数据类型1.3.5 运算符1.3.5.1 \和区别1.3.5.2 类型转换 1.3.6 流程控制语句1.3.6.1 if 语句1.3.6…

常见设计模式

单例模式 单例对象的类必须保证只有一个实例存在&#xff0c;整个系统只能使用一个对象实例&#xff0c;优点&#xff1a;不会频繁地创建和销毁对象&#xff0c;浪费系统资源。缺点是没有抽象层&#xff0c;难以扩展。 单例模式的常见写法&#xff1a; 饿汉式单例模式的写法&…

免安装版MySQL数据库的安装和卸载

说明&#xff1a;MySQL早些版本有分安装版和免安装版&#xff0c;可在官网&#xff08;https://dev.mysql.com/downloads/mysql/&#xff09;下载&#xff0c;推荐使用最新版本&#xff0c;是免安装版的&#xff0c;下载完配置一下就可以用。 推荐使用最新版本 安装 我这里以…

第3章“程序的机器级表示”:过程

文章目录 3.7 过程3.7.1 栈帧3.7.2 转移控制3.7.3 寄存器使用惯例3.7.4 过程示例3.7.5 递归过程 3.7 过程 一个过程调用包括将数据&#xff08;以过程参数和返回值的形式&#xff09;和控制从代码的一部分传递到另一部分。另外&#xff0c;它还必须在进入时为过程的局部变量分…

金融人不能错过的中国人民大学与加拿大女王大学金融硕士,你不能不知道

金融行业是一个发展飞速的行业&#xff0c;越来越多的优秀人士的涌入&#xff0c;让本就卷起来的金融行业变得异常拥挤&#xff0c;怎么办&#xff0c;想留有一席之地只能不断的提升与攀登&#xff0c;金融人不能错过的中国人民大学与加拿大女王大学金融硕士&#xff0c;你不能…

架构EA演进

架构演进 目录概述需求&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve den…

spring cloud搭建(service)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【C++】海量数据处理面试题(位图和布隆过滤器)

都是大厂面试题哦~ 文章目录 一.位图面试题 1.给定100亿个整数&#xff0c;设计算法找到只出现一次的整数 2.给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f; 3.1个文件有100亿个int&#xff0c;1G内…

等价类,边界值,场景法的使用方法和运用场景

等价类&#xff1a; 在很多情况下&#xff0c;很多人想到的测试方法是穷举测试&#xff0c;穷举测试是最全面的测试&#xff0c;但是数据量很大的情况下不太现实&#xff0c;测试效率太低&#xff0c;后来为了减少测试人员的工作量和提高测试的效率和以达到最好的测试质量&…

启明星辰集团CEO严望佳:与AI共生,共建以人为本的数字善治生态体系

近日&#xff0c;2023中国国际大数据产业博览会在贵阳成功召开。启明星辰集团董事长兼首席执行官严望佳应邀出席大会“数据安全产业高质量发展”高端对话&#xff0c;发表“主动应对ChatGPT技术冲击&#xff0c;加强数据安全风险防控”主题演讲&#xff0c;同与会人士共探数据安…

32.有序序列插入一个整数(刷题)

描述 有一个有序数字序列&#xff0c;从小到大排序&#xff0c;将一个新输入的数插入到序列中&#xff0c;保证插入新数后&#xff0c;序列仍然是升序。 输入描述&#xff1a; 第一行输入一个整数N(0≤N≤50)。 第二行输入N个升序排列的整数&#xff0c;输入用空格分隔的N个…

2023年前端面试题汇总-浏览器原理

1. 浏览器安全 1.1. 什么是 XSS 攻击&#xff1f; 1.1. 1. 概念 XSS 攻击指的是跨站脚本攻击&#xff0c;是一种代码注入攻击。攻击者通过在网站注入恶意脚本&#xff0c;使之在用户的浏览器上运行&#xff0c;从而盗取用户的信息如 cookie 等。 XSS 的本质是因为网站没有对…

企业要从哪些方面着手进行数据安全治理?

什么是数据安全治理&#xff1f; 数据安全治理是指组织基于业务发展与合规要求&#xff0c;制定全面且系统的数据安全策略、流程与技术措施&#xff0c;对数据生命周期中的安全风险进行管控与优化的一系列管理活动。它需要从组织层面建立数据安全管理框架&#xff0c;保证敏感数…

2023-6-2-DIS研究

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

Java 列表导出

一、具体实现 import java.net.URLEncoder; import com.alibaba.excel.EasyExcel;List<实体> targets xxx; response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("UTF-8"); String fileName URLEncoder.encode(&…

深入理解设计原则之里氏替换原则(LSP)

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 LSP&#xff1a;里氏替换原则 系列文章目录1、里氏替换原则的定义和解读2、里氏替换原则可以用于哪些设计模式中&#xff1f;3、如何使用里氏替换原则来降低代码耦合度&#…

Julia系列14:调用自定义C/C++库

1. 基础调用&#xff1a;ccall 调用的基本格式为&#xff1a; ccall((:函数名, 库地址), 输出格式, (输入格式列表), 输入数据) 下面是例子&#xff1a; 1.1 基础数据结构 1.2 数组 首先是输入数组&#xff0c;注意需要convert 接着是输出数组&#xff0c;需要使用unsafe…

《操作系统》—— 处理机调度算法

前言&#xff1a; 在之前的文章中&#xff0c;我们已经了解了进程和线程相关的基本概念&#xff0c;今天我们将要了解的是关于处理机调度相关的知识。 目录 &#xff08;一&#xff09;调度的概念 1、调度的基本概念 2、调度的层次 3、三级调度的关系 &#xff08;二&…

遗传算法(Genetic Algorithm)

本文为阅读《遗传算法原理及应用》的笔记和心得 ISBN&#xff1a;7-118-02062-1 遗传算法简介 遗传算法是模拟生物在自然环境中的遗传和进化过程中而形成的一种自适应全局优化概率搜索算法 总的来说&#xff0c;求最优解解或近似最优解的方法主要有三种&#xff1a;枚举法、启…