java数据结构与算法刷题-----LeetCode151. 反转字符串中的单词

LeetCode 151:字符串单词反转的算法实现与优化 字符串处理是编程中的基础技能,涉及遍历、分割、反转等核心操作。在算法领域,字符串反转问题考察了对数据结构的基本操作能力,特别是处理空格和单词顺序的场景。通过双指针技术可以高效实现O(n)时间复杂度,这种方法在搜索引擎查询预处理、文本编辑器开发等工程实践中都有广泛应用。LeetCode 151题作为经典面试题,60%的候选人能实现基础解法,但仅30%掌握最优解。掌握字符串反转技术不仅能提升算法能力,也是处理日志分析、自然语言处理等实际问题的关键。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

在这里插入图片描述

解题思路
  1. 这道题,可以理解为,将字符串颠倒,但是每个单词原来的顺序是什么还是什么,不能改变单词的组合顺序,比如apple,able这个例子,字符串颠倒后为able,apple。整个字符串顺序颠倒了,但是apple和able这两个单词本身,不可以变化。
  2. 难点在于,每个单词中间的空格个数是不确定的,我们无法直接用split()等方法,直接按照空格为分隔符,将字符串分隔开来。会分隔出很多空字符串。
  3. 所以我们不以单个单词这样一个字符串作为单位进行反转,而是把整个字符串,转换为字符数组,进行判断
  1. 首先转换为字符数组: [ , , h, e, l, l, o, , w, o, r, l, d, , ]可以看到这个例子,有很多空字符串
  2. 然后我们先从左向右找到第一个非空字符[ , , h, e, l, l, o, , w, o, r, l, d, , ]
  3. 然后继续向左找到第一个空格[ , , h, e, l, l, o,空格, w, o, r, l, d, , ]
  4. 此时我们就找到了第一个单词的左右下标[ , , h, e, l, l, o, , w, o, r, l, d, , ]
  5. 将其插入新的数组中[w, o, r, l, d, , ],这样就完成了第一个单词的反转工作,也就是将最后一个单词放到第一个位置,然后单词不进行变化
  6. 然后重复上面的步骤,直到所有单词处理完成
代码

在这里插入图片描述

class Solution {
    public String reverseWords(String s) {
        char[] arr = s.toCharArray();//获取字符数组
        char[] newArr = new char[s.length()+1];//保存反转字符串的数组
        int index = 0;//newArr的下标,代表插入位置
        int i = s.length()-1;//我们从后往前遍历,将后面的元素,依次插入到newArr的前面,就实现了反转
        while(i >= 0){//只要还有元素可以遍历就继续
            while(i >= 0 && arr[i] == ' ') i--;//向左找到第一个非空格字符
            int right = i;//让right指向它,代表它是当前单词的最后一个字母位置
            while(i >= 0 && arr[i] != ' ') i--;//继续向左找第一个空格A
            for(int j = i + 1; j <= right; j++){//那么这个A空格,右边第一个字符,就是这个单词的起始位置
                newArr[index++] = arr[j];//将这个单词插入newArr
                if(j == right){//如果插入完成
                    newArr[index++] = ' ';//补上一个空格,分隔开来
                }
            }
        }
        if(index == 0){//如果没插入过字母,就返回空串
            return "";
        }
        return new String(newArr, 0, index-1);//返回答案
    }
}
【中等】力扣算法题解析LeetCode151:反转字符串中的单词 题目要求反转字符串中的单词顺序并去除多余空格。解法分为三步:1) 使用双指针原地去除多余空格;2) 反转整个字符串;3) 逐个反转单词。Java实现通过trimSpaces、reverse和reverseEachWord方法完成,达到O(1)额外空间复杂度。代码高效处理前导、尾随及多余空格,满足进阶要求。 阅读详情

相关推荐

LeetCode151道题Java代码

LeetCode151道题,面试过程中的积累,有个人理解和解释。有的包含多种实现方法。

LeetCode第151场周赛(Java)

LeetCode,Java,错题,题解,周赛,151,TreeSet。

wowpH 486

宏基因组功能注释实战:从CAZyme到VFDB的完整流程(含数据库下载与脚本优化)

本文详细介绍了宏基因组功能注释的完整流程,涵盖CAZyme、eggNOG、CARD和VFDB四大核心数据库的实战应用。从环境配置、数据库下载与预处理到注释流程执行与优化,提供了全面的操作指南和脚本优化建议,帮助研究人员高效完成宏基因组数据分析。特别针对CAZyme注释等关键步骤给出了参数优化方案和常见问题排查方法。

weixin_29289821的博客 296

leetcode 151 翻转字符串

给定一个字符串,逐个翻转字符串中的每个单词 //思路: 1.先剪除字符串左右的空格 2.创建一个数组存放word,从字符串左边开始,当遇到空格时,判定是一个word,用unshift方法将它放到头部去,实现翻转 3.字符串遍历完毕,输出word var reverseWords = function(s) { let left=0 let right=s.length-1 while (left<right && s.charAt(left)==' ') lef

qq_36963007的博客 182

多任务学习中的过拟合陷阱:动态停止训练机制详解与避坑指南

本文深入剖析了多任务学习中因任务过拟合不同步导致的性能下降问题,并详细介绍了动态停止-继续训练机制。该机制通过为每个任务设置独立的训练开关,基于验证集性能动态控制其梯度更新,有效缓解了任务间负迁移,是提升多任务模型整体泛化能力的关键策略。

happy2的博客 1093

Basilisk库教程

要在仿真中执行模块,其调度由Basilisk的[Process]和[Task]容器控制。BSK[Task]包含一系列模块,这些模块都以相同的更新频率执行。一个[Process]本质上是一个任务组,可以包含多个相关的任务。例如,在多星仿真中,你可以为每颗卫星创建一个[Process],以便将相关任务和嵌入式模块有序地组织起来。下图展示了一个示例布局,其中bskSat卫星的动力学被添加到与飞行软件(FSW)算法分开的进程中,这些算法在该卫星上执行。在每个进程中,设置了若干任务,这些任务以指定的频率进行评估。

weixin_57997461的博客 1138

【LeetCode-面试算法经典-Java实现】【151-Evaluate Reverse Polish Notation(计算逆波兰式)】

【LeetCode-面试算法经典-Java实现】【所有题目目录索引】 原题   Evaluate the value of an arithmetic expression in Reverse Polish Notation.   Valid operators are +, -, *, /. Each operand may be an integer or another ex

Tomsheng321的专栏 400

ABA分析方法 — 软硬件开发必备的一种分析问题绝佳套路

可能你从很多地方听过这个名词,无论是在软件开发还是硬件领域(比较典型的领域:汽车、消费电子、医疗等行业),ABA验证都是一种快速分析故障的一个方法,第一次听到这个词,当时是不是一脸懵逼,本文就深度带你了解下ABA的分析方法。简要概述就是:怀疑A模块导致系统故障,将B模块替换A模块,故障消失,再将A模块替换回来,故障复现,则说明A模块是导致系统故障的原因其实,ABA分析问题,可能很多人在工作中都或多或少用过这个方法,只是没有这个概念,说明白了就是控制变量和对比验证,没什么高大上的东西。

Eureka1024的博客 7344

LeetCode-151-翻转字符串里的单词-中等-Java实现

题目: 给定一个字符串,逐个翻转字符串中的每个单词。 示例 1: 输入: "the sky is blue" 输出: "blue is sky the" 示例 2: 输入: " hello world! " 输出: "world! hello" 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 示例 3: 输入: "a good example" 输出: "example good a" 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 说

今天你敲代码了嘛 336

HDR视频技术之七:逆色调映射

HDR 技术说是继 4K 之后视频领域的又一次重大技术突破,不仅提高图像的动态范围,同时也提供了更宽的色域,并提升了画面在高光和暗部的细节信息,带给观看者更加真实的视觉体验。但作为 HDR 产业链的核心,内容短缺的问题仍然是 HDR 普及和成熟的重要限制因素。众多电视厂商将 HDR 技术作为其产品规划中的重要技术,主要是在硬件方面进行提升。而由于 HDR 内容制作对于设备要求较高,对采集、调色、显示等多方面都需要较高的质量要求,内容制作的复杂度和周期长等因素,导致了 HDR 内容的匮乏。

多媒体开发者 2430

Tribon Vitesse开发教程(一)

Tribon Vitesse简介 Tribon Vitesse是Tribon提供给Python编程语言的编程接口,它是一系列的API。使用Python的语法调用这些API,结合Python语言自身的语法生成的程序叫做Vitesse程序。Vitesse是法语“速度”的意思,读作“为戴斯”。使用Tribon Vitesse可以直接访问Tribon产品信息模型和使用Tribon应用程序的功能,以控制设计

forevermemory的专栏 2593

Java描述 LeetCode,151. 反转字符串中的单词

这道题关键就是思路,没什么太多的技巧了,一共三个步骤。

人在江湖 592

储能BMS三级架构解析:从模组到堆的管理与控制

本文深入解析了储能电池管理系统(BMS)的核心三级架构,即电池模组管理层(BMU)、电池簇管理层(BCMU)和电池堆管理层(BAMS)。文章详细阐述了各级的职能分工与协同机制,从底层数据采集、均衡管理,到中层信息汇总与安全控制,再到顶层的系统总控与对外通信,揭示了该架构如何实现大规模储能电池的精细化、安全与高效管理。

ik678901234的博客 472

4-字符串-41-反转字符串中的单词-LeetCode151

4-字符串-41-反转字符串中的单词-LeetCode151

weixin_43873121的博客 1216

工业仪表读数识别:YOLO目标检测 + OCR混合方案实战

仪表整体(meter):粗定位整只仪表,用于快速裁剪、排除背景干扰表盘区域(dial):精确的圆形/方形表盘区域,用于后续矫正和读数数字区域(display)/指针(pointer):数显表定位数码管区域,指针表可辅助定位指针为什么要分三级?因为现场仪表安装角度、距离、光照差异极大。先粗检再精检,比一步到位的准确率高很多,也方便后续做透视变换。工业仪表读数识别,技术路线的选择比算法精度更重要。选对了路线,事半功倍;选错了,怎么调都达不到验收标准。几条落地建议:指针表优先传统算法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 96

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【LeetCode-151】反转字符串中的单词

【LeetCode-151】反转字符串中的单词,在本文中,我们将深入探讨如何反转字符串中的单词顺序。通过详细的解题思路、清晰的代码实现以及生动的案例分析,帮助读者轻松掌握这一经典算法问题。

qq_44530108的博客 972

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【LeetCode刷题日记】:151翻转字符串的单词(两种解法)

本题要求翻转字符串中的单词顺序,并去除首尾及单词间多余空格。核心解法分三步:先去除多余空格(利用双指针和StringBuilder动态判断,确保单词间仅保留一个空格),再反转整个字符串(双指针交换字符),最后逐个反转每个单词(通过空格定位单词边界)。另一种解法是创建新字符数组,从后向前遍历原字符串,提取单词并依次放入新数组,天然实现顺序反转,最后去掉末尾多余空格。两种方法时间复杂度均为 O(n),前者空间 O(1),后者空间 O(n)。

任岁月风干理想再也找不回真的我 1117

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

给你一个字符串s,请你反转字符串中的顺序。是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的分隔开。返回顺序颠倒且之间用单个空格连接的结果字符串。输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。反转后的字符串中不能存在前导空格和尾随空格。如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

qq_65031432的博客 1078

【经典算法】LeetCode 151. 反转字符串中的单词(Java/C/Python3实现含注释说明,中等)

方式优点缺点时间复杂度空间复杂度方式一直观且易于理解在 Java 和 Python 中可能需要额外的空间O(n)方式二递归实现相对复杂,可能导致栈溢出(在递归情况下)O(n)O(n)

2053

151. 反转字符串中的单词

本文解析了力扣151题"反转字符串中的单词"的高效解法。该算法采用双指针从后向前遍历的策略,先去除首尾空格,然后定位单词边界进行反向拼接,最后处理多余空格。相比传统分割-反转方法,这种实现具有O(n)时间复杂度和更优的空间效率,能妥善处理前导/尾随空格及连续空格问题。文章详细拆解了代码逻辑,通过示例演示执行流程,并对比了不同实现方法的优劣,展现了算法设计中对效率、简洁性和边界处理的全面考量。该解法体现了双指针技术在字符串处理中的高效应用。

mrjieke6的博客 860

【数据结构和算法】反转字符串中的单词

给你一个字符串s,请你反转字符串中单词的顺序。 单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。 返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。 注意:输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

船到桥头自然直 1107

LeetCode-Java:151.反转字符串当中的单词

LeetCode:151.反转字符串当中的单词(中等)

weixin_63505616的博客 1207

leetcode_151. 反转字符串中的单词_java

151. 反转字符串中的单词。

weixin_46211609的博客 580

刷算法Leetcode---4(字符串篇)

Leetcode算法之字符串篇~

m0_70220973的博客 1827

刷题计划day8 字符串上【反转字符串】【反转字符串 II】【反转字符串中的单词】

刷题计划day8 字符串上【反转字符串】【反转字符串 II】【反转字符串中的单词】⚡刷题计划day8继续,往期可看专栏,关注不迷路。只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。题外话,这题c++和java都有库函数直接调用就可以,但这样,就不清楚反转字符串的原理了。因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。举个例子,源字符串为:"the sky is blue "但是也不是说库函数就不能用,是要分场景的。

weixin_72499901的博客 958

双指针or原地操作数组?——力扣151.反转字符串中的单词

本题的关键在于高效处理空格和灵活操作字符串结构。方法一适合快速实现,逻辑清晰。方法二展示了原地操作的技巧,适合追求空间优化的进阶挑战。根据实际需求选择合适的方法即可。

w1311823723的博客 1014
上一篇: java数据结构与算法刷题-----LeetCode541. 反转字符串 II
下一篇: java数据结构与算法基础-----字符串------KMP算法
ydenergy_殷志鹏
博客等级 码龄7年 5886粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值