面试经典算法系列之数组/字符串5 -- 反转字符串中的单词

面试经典算法题37-反转字符串中的单词

LeetCode.151
公众号:阿Q技术站

问题描述

给你一个字符串 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 ,记录每个单词的起始和结束位置;
  2. 将每个单词拼接到结果字符串中,单词之间用一个空格分隔。

图解

这里根据示例一给大家进行一个流程的分解。

            +--------------------------------+
            |         开始执行程序             |
            +--------------------------------+
                           |
                           v
            +--------------------------------+
            |         输入字符串s              |
            |      s = "the sky is blue"     |
            +--------------------------------+
                           |
                           v
            +--------------------------------+
            |       初始化结果字符串result      |
            |            result = ""         |
            +--------------------------------+
                           |
                           v
            +--------------------------------+
            |       初始化结束位置end          |
            |          end = 14              |
            +--------------------------------+
                           |
                           v
            +--------------------------------+
            |       从后向前遍历字符串s         |
            +--------------------------------+
                           |
                           v
            +--------------------------------+
            |      当前字符为' '时             |
            |      更新结束位置end             |
            +--------------------------------+
                           |
                           v
    +-------------------------------------------------+
    |      当前字符为非空格且前一个字符为空格或当前位置为0时  |
    |      如果结果字符串result非空,添加一个空格到result   |
    |      将当前单词加入结果字符串result                 |
    +-------------------------------------------------+
                           |
                           v
            +---------------------------------+
            |         返回结果字符串result      |
            |      result = "blue is sky the" |
            +---------------------------------+
                           |
                           v
            +--------------------------------+
            |           结束程序              |
            +--------------------------------+

参考代码

C++
#include <iostream>
#include <string>

using namespace std;

class Solution {
public:
    string reverseWords(string s) {
        string result = ""; // 初始化结果字符串
        int end = s.length(); // 结束位置为字符串长度

        for (int i = s.length() - 1; i >= 0; --i) { // 倒序遍历字符串
            if (s[i] == ' ') { // 遇到空格,更新结束位置
                end = i;
            } else if (i == 0 || s[i - 1] == ' ') { // 遇到单词起始位置
                if (!result.empty()) { // 如果结果字符串非空,加入一个空格
                    result += " ";
                }
                result += s.substr(i, end - i); // 将单词加入结果字符串
            }
        }

        return result; // 返回结果字符串
    }
};

int main() {
    string s = "the sky is blue"; // 输入字符串
    Solution solution;
    string result = solution.reverseWords(s); // 反转单词顺序
    cout << "反转后的字符串:" << result << endl; // 输出结果

    return 0;
}

这个方法直接封神!

Java
public class Solution {
    public String reverseWords(String s) {
        String[] words = s.trim().split("\\s+"); // 按空格分割字符串
        StringBuilder result = new StringBuilder(); // 初始化结果字符串

        for (int i = words.length - 1; i >= 0; i--) { // 倒序遍历单词数组
            result.append(words[i]); // 将单词加入结果字符串
            if (i > 0) {
                result.append(" "); // 添加单词间的空格
            }
        }

        return result.toString(); // 返回结果字符串
    }

    public static void main(String[] args) {
        String s = "the sky is blue"; // 输入字符串
        Solution solution = new Solution();
        String result = solution.reverseWords(s); // 反转单词顺序
        System.out.println("反转后的字符串:" + result); // 输出结果
    }
}
Python
class Solution:
    def reverseWords(self, s: str) -> str:
        words = s.split()  # 按空格分割字符串
        words.reverse()  # 反转单词列表
        return ' '.join(words)  # 连接成字符串

# 测试代码
s = "the sky is blue"  # 输入字符串
solution = Solution()
result = solution.reverseWords(s)  # 反转单词顺序
print("反转后的字符串:", result)  # 输出结果

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

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

相关文章

【JavaEE 初阶(五)】文件操作和IO

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多文件操作 目录 1.前言2.认识文件3.文件操作3.1File 属性3.2构造方法3.3File类方法 4.文件内容操作4.1R…

栈和队列的相互实现

1. 两个队列实现栈. - 力扣&#xff08;LeetCode&#xff09; 队列的特点是先进先出&#xff0c;而栈的特点是后进先出&#xff08;先进后出&#xff09;&#xff0c;也就是说重点在于利用两个队列来改变“出”的顺序。 假设我们在进行入栈操作的时候将数据依次入到一个队列中…

国产操作系统下Chrome的命令行使用 _ 统信 _ 麒麟

原文链接&#xff1a;国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello&#xff0c;大家好啊&#xff01;今天我们来聊聊如何在国产操作系统上使用命令行操作Google Chrome。无论是进行自动化测试、网页截图还是网页数据抓取&#xff0c;使用命令行操作Google Chrome都能…

LVS的三种工作模式---(DR/TUN/NAT)

目录 一、NAT模式&#xff08;LVS-NAT&#xff09; 二、IP隧道模式&#xff08;LVS-TUN&#xff09; 三、DR模型--直接路由模式&#xff08;LVS-DR&#xff09; LVS/DR模式ARP抑制 原因&#xff1a; LVS的DR工作模式及配置&#xff1a; LVS的NAT工作模式及配置&#xff1…

Python游戏制作大师,Pygame库的深度探索与实践

写在前言 hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎关注交流。 希望可以持续更新一些有意思的文章&#xff0c;如果觉得还不错&#xff0c;欢迎点赞关注&#xff0c;有啥想说的&#x…

ppt图片居中对齐

今天简单尝试了一下ppt图片怎么居中对齐&#xff0c;记录如下 准备一张图片 可以把位置该成居中 就可以让图形居中了

完全背包问题(c++)

完全背包问题 当前有 N 种物品&#xff0c;第 i 种物品的体积是 ci​&#xff0c;价值是 wi​。 每种物品的数量都是无限的&#xff0c;可以选择任意数量放入背包。 现有容量为 V 的背包&#xff0c;请你放入若干物品&#xff0c;使总体积不超过 V&#xff0c;并且总价值尽可…

7. path路径绘制:使用path绘制曲线

曲线在SVG中通常是通过贝塞尔曲线命令来绘制的&#xff0c;包括二次贝塞尔曲线&#xff08;Q&#xff09;和三次贝塞尔曲线&#xff08;C&#xff09;。这些命令允许我们创建平滑的曲线路径。 贝塞尔曲线的原理 贝塞尔曲线的基本原理是通过控制点和锚点来定义一条曲线的形状。…

Android的视图显示和管理机制:layout view window WindowManager Canvas Surface

在Android系统中&#xff0c;Layout view window WindowManager Canvas Surface SurfaceFlinger这些组件协同工作&#xff0c;以实现图形的绘制和显示。需要搞明白这些组件是什么时候创建的以及他们之间的结构关系。 从上到下的层级关系&#xff1a;用户在View上进行操作&…

数据结构复习指导之树、森林

文章目录 树、森林 考纲内容 复习提示 1.树的存储结构 1.1双亲表示法 1.2孩子表示法 1.3孩子兄弟表示法 2.树、森林、与二叉树的转换 2.1树转换为二叉树 2.2森林转换为二叉树 2.3二叉树转换为森林 3.树和森林的遍历 3.1树的遍历 3.2森林的遍历 树、森林 考纲内容…

手机电脑通用便签推荐 好用便签下载

便签软件作为一种日常记录和管理工具&#xff0c;其实用性和便捷性深受用户喜爱。一款优秀的便签软件不仅能帮助我们随时随地记录重要信息&#xff0c;还能有效提高工作效率。然而&#xff0c;市场上很多便签应用仅限于单一平台使用&#xff0c;对于需要在手机和电脑间频繁切换…

FPGA第1篇,FPGA现场可编程门阵列,从0开始掌握可编程硬件开发(FPGA入门指南)

简介&#xff1a;FPGA全称Field-Programmable Gate Array&#xff0c;是一种可编程逻辑器件&#xff0c;它通过可编程的逻辑单元和可编程的连接网络实现了灵活的硬件实现。与固定功能的集成电路&#xff08;ASIC&#xff09;相比&#xff0c;FPGA具有更高的灵活性和可重新配置性…

python随机显示四级词汇

python实现一个浮动窗口随机显示四级单词在桌面跑来跑去 实现一个浮动窗体随机显示四级单词在windows桌面置顶移动 tkinter库来创建窗口和显示单词&#xff0c;以及random库来随机选择单词。 使用after方法来定时更新窗口的位置&#xff0c;实现单词窗口的慢慢移动效果 使用…

day10-Map集合

Map 1.Map 1.1 Map简介 1.为什么使用Map集合 购物车提供的四个商品和购买的数量在后台需要容器存储。 每个商品对象都一一对应一个购买数量。 把商品对象看成是Map集合的键&#xff0c;购买数量看成Map集合的值。 例如: {商品12 , 商品23 &#xff0c; 商品3 2 , 商品4…

GitHub操作

远程库-GitHub GitHub网址 GitHub是全球最大的远程库 1. 创建远程库 2. 远程仓库操作 2.1 创建远程仓库别名 git remote -v 查看当前所有远程库地址别名 git remote add 别名 远程地址 设置远程库地址别名 案例操作 起一个别名会出现两个别名&#xff0c;是因为既可以拉取…

第二步->手撕spring源码之bean操作

本步骤目标 本步骤继续完善 Spring Bean 容器框架的功能开发&#xff0c;在这个开发过程中会用到较多的接口、类、抽象类&#xff0c;它们之间会有类的实现、类的继承。 这一次我们把 Bean 的创建交给容器&#xff0c;而不是我们在调用时候传递一个实例化好的 Bean 对象&#x…

vue3使用setup模式的store报错

** setup store模式 $reset方法报错 ** 顾名思义就是 使用store 使用的是setup 语法模式 不能执行$reset 方法 解决方式&#xff1a; // main.ts import { createPinia } from pinia const pinia createPinia() pinia.use(({ store }) > {const initialState JSON.pars…

JupyterLab OpenCV展示图片

JupyterLab OpenCV展示图片 方式一 注意&#xff1a;此种方式如果在远程服务器上的JupyterLab上运行&#xff0c;可能会出现错误。 import cv2# 读取图片 image cv2.imread(photo/blg.png)# 显示图片 cv2.imshow(image, image)# 等待按键&#xff0c;之后关闭所有窗口 cv2.w…

c语言题库之多个数组从两边移动向中间汇聚

文章目录 题目分析代码实现代码分析 题目 c语言题库之多个数组从两边移动向中间汇聚 呈现效果&#xff1a;输入想要输入的字符数组呈现数组从两边向中间逐渐打开的样子 分析 首先我们需要一组我们想要输入的字符数组用来展示打开的字符其次我们需要进行对数组的替换&#x…

基于STM32单片机的环境监测系统设计与实现

基于STM32单片机的环境监测系统设计与实现 摘要 随着环境污染和室内空气质量问题的日益严重&#xff0c;环境监测系统的应用变得尤为重要。本文设计并实现了一种基于STM32单片机的环境监测系统&#xff0c;该系统能够实时监测并显示室内环境的温湿度、甲醛浓度以及二氧化碳浓…