leetcode刷题记录(二十六)——151. 反转字符串中的单词

news2024/11/24 13:53:37

(一)问题描述

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/reverse-words-in-a-string/description/

给你一个字符串 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)去除所有重复的空格和首尾空格;(2)将所有单词反转,不考虑单词当中字母的顺序,也就是将整个字符串反转;(3)逐个反转每个单词中的字母。对于Java而言,String不能直接修改,因此不得不使用额外空间。如果是其他语言,这个方式是可以实现O(1)的空间复杂度的。使用双指针的方式也可以解决这个问题,但是在不使用额外空间的情况下不如这个三步的方式好理解。掌握好理解的方法考试时才更容易做得上嘛。

//处理首尾空格和重复的空格
public StringBuffer removeSpace(String s){
       StringBuffer reverse=new StringBuffer();
       int start=0,end=s.length()-1;
       //跳过首尾空格
       while(s.charAt(start)==' '){start++;}
       while(s.charAt(end)==' '){end--;}
       //注意这里是小于等于,不是小于,否则会漏掉最后一个字母
       while(start<=end){
           if(s.charAt(start)!=' '||reverse.charAt(reverse.length()-1)!=' '){
               reverse.append(s.charAt(start));
           }
           start++;
       }
       return reverse;
}

//反转字符串,或字符串的一部分(从start到end)
public void reverseString(StringBuffer s,int start,int end){
        char temp;
        while(start<end){
            temp=s.charAt(start);
            s.setCharAt(start,s.charAt(end));
            s.setCharAt(end,temp);
            start++;
            end--;
        }
}

//反转其中的每个单词,找到单词,然后调用反转字符串函数
    public void reversEachWord(StringBuffer result){
        
        int start=0,end=0;
        while(start<result.length()){
           while(end<result.length()&&result.charAt(end)!=' '){
            end++;
           }
           reverseString(result,start,end-1);
           start=end+1;
           
           end=start+1;
        }
    }

//leetcode里给好的那个要填答案的函数
public String reverseWords(String s) {
        //去除多余的空格
        StringBuffer result=removeSpace(s);
        
        //反转整个字符串
        reverseString(result,0,result.length()-1);

        //反转单个单词
        reversEachWord(result);
        return result.toString();
}

(三)易错点

总结一下我认为比较容易写晕的几个地方:

1. 空格也是个字符啊,空格不是null,别拿null判断!

2. 在Java当中,引用类型变量作为外部参数传入函数中时,它的值是会被函数操作修改的,而基本类型不会。所有对象都是引用类型变量,除了八种基本数据类型以外都是引用类型(八中基本数据类型包括整型(byte、short、int、long)浮点型(float、double)字符型(char)布尔型(boolean)),这就是为什么两个反转函数可以这么写。

3. StringBuffer有一个reverse方法,在反转整个字符串这一步用这个方法也是可以的。在反转单个单词这里,额外使用一个反转部分字符串的函数更好,直接写的话在交换部分可能会涉及start和end的移动,移着移着乱套了。

4. 我写乱了的地方:

  • 怎么删掉头尾的空格,还能删掉重复的空格并且保留一个。脑子晕了,使用额外空间的情况下这个操作太简单了:放入额外空间之前直接跳过头尾空格元素,中间的空格就直接判断一下上一个添加进去的是不是空格,是的话就跳过。如果是Java外的其他语言,应当使用和27.移除元素思路类似的快慢指针来解决。
  • 怎么找到每个单词,并且每次只反转这个单词。我最开始想的是最后一个单词应该是end先接触字符串的末端,应该用end是否超过字符串长度来控制最外层的循环。实际上end每次要去找单词的结尾,在找到最后一个结尾时操作其实还没有结束,所以应该用start来控制最外层循环,当start超过字符串长度时再终止循环。每次操作结束后,start应该位于上一次end的后一个字母,end应该要调整到start后一位。我忘记调整end,导致死循环。另外,每次反转单词时,end是位于单词末尾后的那个空格上,因此传入参数是end-1。

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

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

相关文章

python中常见的8种数据结构之一数组的应用

在Python中&#xff0c;数组是一种常见的数据结构&#xff0c;用于存储一系列相同类型的元素。在实际应用中&#xff0c;数组可以用于解决各种问题。 以下是数组在Python中的一些常见应用&#xff1a; 1. 存储和访问数据&#xff1a;数组可以用于存储和访问一组数据。可以通过…

JS禁用鼠标滚动条功能且滚动条不消失教程

这个JS功能我找了好久好久才找到的&#xff0c;希望能够帮助到大家&#xff0c;网上有很多教程虽然能够实现禁用滚动条的效果&#xff0c;但是滚动条却直接消失不见了&#xff0c;那么今天我就把禁用滚动条但滚动条不消失的JS代码分享给大家。 实例代码如下&#xff1a; JS禁用…

学习虚幻C++开发日志——定时器

官方文档&#xff1a;虚幻引擎中的Gameplay定时器 | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 定时器 安排在经过一定延迟或一段时间结束后要执行的操作。例如&#xff0c;您可能希望玩家在获取某个能力提升道具后变得无懈可击&#xff0c;…

记录Postman接口测试,配置token为全局变量,配置测试环境

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 为什么要进行接口测试&#xff1a; 因为不同端&#xff08;前段&#xff0c;后端&#xff0…

单臂路由技术,eNSP实验讲解

单臂路由技术&#xff0c;eNSP实验讲解 一、简要介绍1、概念2、工作原理3、优点4、缺点5、应用场景举例 二、eNSP仿真实验1、步骤一&#xff1a;2、步骤二&#xff1a;3、步骤三&#xff1a;4、步骤四&#xff1a; 三、总结。 一、简要介绍 1、概念 单臂路由&#xff08;Rout…

数据库SQL——什么是实体-联系模型(E-R模型)?

目录 什么是实体-联系模型&#xff1f; 1.实体集 2.联系集 3.映射基数 一对一&#xff08;1:1&#xff09; 一对多&#xff08;1:n&#xff09; 多对一&#xff08;n:1&#xff09; 多对多&#xff08;m:n&#xff09; 全部参与&#xff1a; 4.主码 弱实体集&#xf…

WPS Office手机去广高级版

工具介绍功能特点 WPS Office是使用人数最多的移动办公软件&#xff0c;独有手机阅读模式&#xff0c;字体清晰翻页流畅&#xff1b;完美支持文字&#xff0c;表格&#xff0c;演示&#xff0c;PDF等51种文档格式&#xff1b;新版本具有海量精美模版及高级功能 安装环境 [名称…

【微服务】Docker 容器化

一、初识Docker 1. 为什么需要 Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会遇到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性的问题开发、测试、生产环境有差异 Docker 如何解决依赖的兼容问题 将应用的Libs&#xff08;…

Yocto 项目下通过网络更新内核、设备树及模块

Yocto 项目下通过网络更新内核、设备树及模块 前言 在 Yocto 项目的开发过程中&#xff0c;特别是在进行 BSP&#xff08;Board Support Package&#xff09;开发时&#xff0c;经常需要调整特定软件包的版本&#xff0c;修改内核、设备树以及内核模块。然而&#xff0c;每次…

EasyExcel级联下拉

代码 package com.xc.excel.select;import com.alibaba.excel.EasyExcel; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileOutputStream; import java.i…

密码学知识点整理二:常见的加密算法

常用的加密算法包括对称加密算法、非对称加密算法和散列算法。 对称加密算法 AES&#xff1a;高级加密标准&#xff0c;是目前使用最广泛的对称加密算法之一&#xff0c;支持多种密钥长度&#xff08;128位、192位、256位&#xff09;&#xff0c;安全性高&#xff0c;加密效率…

excel功能

统计excel中每个名字出现的次数 在Excel中统计每个名字出现的次数&#xff0c;您可以使用COUNTIF函数或数据透视表。以下是两种方法的详细步骤&#xff1a; 方法一&#xff1a;使用COUNTIF函数 准备数据&#xff1a;确保您的姓名列表位于一个连续的单元格区域&#xff0c;例如…

题目练习之二叉树那些事儿

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

绘制3D图

一个 3D 函数的表面图&#xff0c;其中包含向量场。 Python 代码示例&#xff0c;使用 matplotlib 和 numpy 库来绘制类似的图。 python 复制代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 生成网格 x np.linspace(-…

2024 网鼎杯 - 青龙组 Web WP

2024 网鼎杯 - 青龙组 WEB - 02 打开容器一个登录界面&#xff0c;随便输入账号密码可以进到漏洞界面 这里有一个发送给boss的功能&#xff0c;一眼xss 有三个接口&#xff1a;/flag 、/update 、/submit /flag &#xff1a;要求boss才能访问&#xff0c;/update &#xf…

【Linux】 IPC 进程间通信(三)(消息队列 信号量)

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 一、消息队列 &#x1f48c;…

推荐一款Windows卸载工具:

Glary Absolute Uninstaller类似于标准的Windows添加/删除程序&#xff0c;但功能更强大。标准的添加/删除程序无法完全卸载应用程序&#xff0c;这通常会在硬盘上留下损坏的注册表项和不需要的文件。您的计算机拥有的垃圾文件越多&#xff0c;运行速度就越慢。Absolute Uninst…

资产管理系统:SpringBoot技术实现

企业资产管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业资产管理系统的开发全过程。通过分析企业资产管理系统方面的不足&#xff0c;创建了一个计算机管理企业资产管理系统的方案。文章介绍了企…

[High Speed Serial ] Xilinx

Xilinx 高速串行数据接口 收发器产品涵盖了当今高速协议的方方面面。GTH 和 GTY 收发器提供要求苛刻的光互连所需的低抖动&#xff0c;并具有世界一流的自适应均衡功能&#xff0c;具有困难的背板操作所需的 PCS 功能。 Versal™ GTY &#xff08;32.75Gb/s&#xff09;&…

数据表单查询,简单查询操作

一.简单查询,带条件查询 1.请按照以下要求查询表goods中的数据。 goods表结构如下&#xff1a; -- 创建表&#xff1a; use test; drop table if exists goods; create table if not exists goods ( id int(11) not null comment 商品编号, name varchar(20) default null…