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

文章目录

    • 题目
    • 补充知识
      • ArrayList动态数组
      • StringBuilder类
      • ①穷举法
      • ②穷举法改进
      • ③双指针

题目

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

**注意:**输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

补充知识

ArrayList动态数组

ArrayList的基本使用方式:

  1. 导入ArrayList类:

    import java.util.ArrayList;
    
  2. 创建ArrayList对象:

    ArrayList<String> list = new ArrayList<>();
    
  3. 添加元素到ArrayList中:

    list.add("Element1");
    
  4. 获取ArrayList中的元素:

    String element = list.get(index);
    
  5. 修改ArrayList中的元素:

    list.set(index, newValue);
    
  6. 删除ArrayList中的元素:

    list.remove(index);
    
  7. 获取ArrayList的大小:

    int size = list.size();
    
  8. 检查ArrayList是否为空:

    boolean isEmpty = list.isEmpty();
    
  9. 遍历ArrayList:

    • 使用for循环:

      for (int i = 0; i < list.size(); i++) {String element = list.get(i);
      }
      
    • 使用增强型for循环:

      for (String element : list) {}
      
  10. 检查ArrayList是否包含某个元素:

    boolean containsElement = list.contains("Element1");
    
  11. 清空ArrayList:

    list.clear();
    
  12. 转换为数组:

    String[] array = list.toArray(new String[0]);
    

StringBuilder类

常用方法:

  1. append(): 在字符串构建器的末尾追加字符串、字符或其他数据。

    StringBuilder sb = new StringBuilder();
    sb.append("Hello");
    sb.append(" ");
    sb.append("world");
    
  2. insert(): 在指定位置插入字符串、字符或其他数据。

    StringBuilder sb = new StringBuilder("Hello world");
    sb.insert(5, ", "); // Hello, world
    
  3. delete(): 删除从指定位置开始到指定位置结束之间的字符(前闭后开,包括开始位置不包括结束位置)。

    StringBuilder sb = new StringBuilder("Hello world");
    sb.delete(5, 11); // 删除 " world" 变成 "Hello"
    
  4. deleteCharAt(): 删除指定位置的字符。

    StringBuilder sb = new StringBuilder("Hello world");
    sb.deleteCharAt(5); // 删除空格
    
  5. replace(): 用指定字符串替换从指定开始索引到指定结束索引之间的字符。

    StringBuilder sb = new StringBuilder("Hello world");
    sb.replace(6, 11, "Java"); // 替换 "world" 为 "Java"
    
  6. substring(): 返回从指定开始索引到指定结束索引之间的子字符串。

    StringBuilder sb = new StringBuilder("Hello world");
    String sub = sb.substring(6, 11); // 获取 "world"
    
  7. reverse(): 反转字符串。

    StringBuilder sb = new StringBuilder("Hello");
    sb.reverse(); // 变为 "olleH"
    
  8. charAt(): 返回指定索引处的字符。

    cStringBuilder sb = new StringBuilder("Hello");
    char c = sb.charAt(1); // 获取索引为1的字符 'e'
    
  9. length(): 返回字符串的长度。

    StringBuilder sb = new StringBuilder("Hello");
    int length = sb.length(); // 返回5
    
  10. indexOf() / lastIndexOf(): 返回指定字符串或字符在字符串构建器中第一次出现的索引或最后一次出现的索引。

    StringBuilder sb = new StringBuilder("Hello world");
    int index1 = sb.indexOf("o"); // 返回4
    int index2 = sb.lastIndexOf("o"); // 返回7
    
  11. toString(): 将字符串构建器转换为普通的字符串。

    StringBuilder sb = new StringBuilder("Hello world");
    String str = sb.toString(); // 返回 "Hello world"
    

①穷举法

11ms,超过11%

设置了一个动态数组,遍历s,判断当前元素和上一个元素是否为空

上一个元素为空,当前不是空的时候,记录单词的起始位置

上一个元素不为空,当前为空的时候,将单词加入到动态数组当中

如果是s的最后一个元素,需要判断是否是空格,如果不是空格的话,要将最后一个单词加入到动态数组

最后倒着遍历整个动态数组,存入到字符串end

import java.util.ArrayList;
class Solution {public String reverseWords(String s) {boolean cur=false;boolean last=true;//上一个是否是空String end=new String();int start=0;ArrayList<String> strs=new ArrayList<String>();for(int i=0;i<s.length();i++){char element=s.charAt(i);cur=(element==' ')?true:false;last=(i!=0 && s.charAt(i-1)==' ')?true:false;if(last && !cur){//如果上一个是空格,当前不是空格//则记录开始的位置start=i;}if(i!=0 && !last && cur){//如果上一个不是空格,这一个是空格String str=s.substring(start,i);strs.add(str);}if(i==s.length()-1 && !cur){// 如果是最后一个,也要考虑一下最后一个不是空格的情况~String str=s.substring(start,i+1);strs.add(str);}           }System.out.print(strs.get(0)+"/");for(int i=strs.size()-1;i>=0;i--){end+=strs.get(i);if(i!=0){end+=" ";}}return end;}
}

②穷举法改进

7ms,超过42.8%

①当中的end从String类型改成StringBuilder类型

import java.util.ArrayList;
class Solution {public String reverseWords(String s) {boolean cur=false;boolean last=true;//上一个是否是空StringBuilder end=new StringBuilder();int start=0;ArrayList<String> strs=new ArrayList<String>();for(int i=0;i<s.length();i++){char element=s.charAt(i);cur=(element==' ')?true:false;last=(i!=0 && s.charAt(i-1)==' ')?true:false;if(last && !cur){//如果上一个是空格,当前不是空格//则记录开始的位置start=i;}if(i!=0 && !last && cur){//如果上一个不是空格,这一个是空格String str=s.substring(start,i);strs.add(str);}if(i==s.length()-1 && !cur){// 如果是最后一个,也要考虑一下最后一个不是空格的情况~String str=s.substring(start,i+1);strs.add(str);}           }for(int i=strs.size()-1;i>=0;i--){end.append(strs.get(i));if(i!=0){end.append(" ");}}return end.toString();}
}

③双指针

4ms,81.48%

参考leetcode-Krahets

通过string类的trim函数可以去除字符串的首尾空格,主要是没有想到用while的方式完成代码,实际上①②都有点类似双指针的解法,都是找到了单词的首尾,然后进行记录,当前代码和之前不同的地方在于没有使用动态数组,直接将单词保存在StringBuilder当中,并且采用的是从后向前读取,不需要考虑翻转问题。(直接保存到StringBuilder是个挺好的想法,本来想尝试修改②的代码,突然发现是正序的,如果修改的话会比较麻烦,遂放弃)

import java.util.ArrayList;
class Solution {public String reverseWords(String s) {s=s.trim();//去除首尾空格StringBuilder strs=new StringBuilder();int j=s.length()-1,i=j;//初始ij都在字符串末尾的地方while(i>=0){while(i>=0 && s.charAt(i)!=' ') i--;//跳过不是空格的元素strs.append(s.substring(i+1,j+1)+" ");//遇到空格,则添加元素到strs,按照题目要求单词之间空格隔开while(i>=0 && s.charAt(i)==' ') i--;//跳过两个单词之间的空格j=i;//定位到下一个单词的末尾处}return strs.toString().trim();//添加元素的时候,每个元素后面都增加了" ",这里需要删除一下 }
}

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

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

相关文章

小型社区与园区如何选购合适的停车场道闸系统?需注意什么

小型社区和园区停车场通常面临着空间有限、预算有限以及车流量相对较小的挑战。这些特点要求停车场的管理系统既要经济实用&#xff0c;又要能够满足基本的车辆管理需求&#xff0c;如安全性、通行效率和便捷性。针对这些特点&#xff0c;选择合适的停车道闸系统成为提高管理效…

天诚物联网锁亮相福州南京沈阳西安展会,与您见证AIoT行业发展

目光灼灼&#xff0c;步履不辍。自4月1日第七届CCLE中国教育后勤展览会一别&#xff0c;全场景AIoT解决方案服务商——江苏新巢天诚智能技术有限公司&#xff08;以下简称“天诚”&#xff09;打造的校园物联网锁软硬一体化解决方案获得了诸多准意向代理商、集成商同仁们的咨询…

2011年认证杯SPSSPRO杯数学建模B题(第二阶段)生物多样性的评估全过程文档及程序

2011年认证杯SPSSPRO杯数学建模 B题 生物多样性的评估 原题再现&#xff1a; 2010 年是联合国大会确定的国际生物多样性年。保护地球上的生物多样性已经越来越被人类社会所关注&#xff0c;相关的大规模科研和考察计划也层出不穷。为了更好地建立国际交流与专家间的合作&…

【网络安全】网络安全,你我同行——网络安全指南请查收~

网络是一把双刃剑&#xff0c;在给我们带来便捷生活的同时&#xff0c;也埋下了种种安全隐患。作为网络的亲身参与者&#xff0c;我们应该主动学习网络安全知识。快让我们一起来看看&#xff0c;本期安全小讲堂带来了哪些网络安全知识吧~ 01 常见网络安全隐患 网络安全问题无…

Docker镜像,什么是Docker镜像,Docker基本常用命令

docker镜像 1.1什么是镜像&#xff0c;镜像基础 1.1.1 镜像的简介 镜像是一种轻量级&#xff0c;可执行的独立软件包&#xff0c;也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境&#xff0c;具体来说镜像包含运行某个软件所需的所有内容&#xff0c;…

记一次逻辑漏洞拿下目标站点

开局某平台登录框 可做尝试手法 1、弱口令 2、万能密码 3、复杂密码逻辑绕过 4、登录框逻辑绕过 5、登录框注入 正文 某通用平台&#xff0c;系xxx科技公司开发全套模板通用系统&#xff0c;演示站踩点弱口令&#xff0c;这里主要梳理踩点思路 1、某接口未授权访问读系统用户…

20240406-算法复习打卡day46||● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 令word s中从 j 处开始&#xff0c;长度 i - j 的字符串 如果wordSet.find(word) ! wordSet.end()&#xff0c;说明word在wordSet中&#xff0c;当前d[j]为true时&#xff0c;符合条件 class Solution { public:bool wordBreak(string s, vector<string>&…

聊聊主流开源协议

【写在前面】 开源协议是开源软件生态系统的基石&#xff0c;它们为软件开发、分发和使用提供了明确的法律指导和框架。以下是为什么我们需要开源协议的详细解释&#xff1a; 保护开发者的权益 开源协议确保开发者能够保留对其原创作品的某些基本权利。例如&#xff0c;它们可…

前端Vue自定义勾选协议组件的开发与应用

摘要&#xff1a; 随着前端技术的不断发展&#xff0c;用户体验成为了软件开发中的关键要素。在登录、注册等场景中&#xff0c;勾选协议是常见的需求。本文旨在介绍一款基于 Vue.js 的自定义勾选协议组件的开发与应用&#xff0c;该组件适用于多种场景&#xff0c;并且具备良…

无代理备份ESXi虚拟机

目前&#xff0c;虚拟机主要采用映像级备份方式&#xff0c;因为这样才能保证虚拟机数据的完整性&#xff0c;尤其是对于像VMware ESXi这样的一类虚拟机管理程序上的虚拟机。除此之外&#xff0c;还有一种文件级备份方法&#xff0c;允许颗粒备份和还原。我们区分这两种备份方法…

基于springboot实现课程答疑管理系统项目【项目源码+论文说明】

基于springboot实现课程答疑管理系统演示 摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了…

vue控制台报错Duplicate keys detected: ‘xxxxx‘. This may cause an update error.解决方案

截图报错&#xff1a; 错误分析&#xff1a; 1、提示 Duplicate keys detected &#xff0c;翻译为&#xff1a;检测到重复的密钥 2、检查 v-for 代码&#xff0c;具体如下&#xff1a; 发现问题&#xff1a;v-for中的key是一个相同的值 解决问题 因此处使用的是测试数据&…

WebKit架构简介:深入探索与代码实例分析

WebKit&#xff0c;作为一款开源的网页浏览器引擎&#xff0c;被广泛应用于Safari、Google Chrome&#xff08;在Chrome中&#xff0c;WebKit的主要部分已经被 Blink 引擎替代&#xff09;和其他众多基于WebKit开发的浏览器中。WebKit的设计以KHTML为基础&#xff0c;并采用KHT…

论如何在小程序展示超链接在线网页

在工作中遇到一个需求&#xff0c;就是在小程序中展示超链接网页&#xff0c;起初我是直接使用web-view标签 <web-view src"https://www.baidu.com/"/>但是web-view只能在开发阶段手机上展示&#xff0c;一旦小程序发布线上&#xff0c;就会出现下面这种情况“…

Spectre漏洞 v2 版本再现,影响英特尔 CPU + Linux 组合设备

近日&#xff0c;网络安全研究人员披露了针对英特尔系统上 Linux 内核的首个原生 Spectre v2 漏洞&#xff0c;该漏洞是2018 年曝出的严重处理器“幽灵”&#xff08;Spectre&#xff09;漏洞 v2 衍生版本&#xff0c;利用该漏洞可以从内存中读取敏感数据&#xff0c;主要影响英…

html中的“居中”问题详解(超全)

html中的“居中”问题详解&#xff08;超全&#xff09; 图片居中文本居中定位居中元素居中响应式设计中的居中技巧 引言&#xff1a; 在网页设计和开发中&#xff0c;实现元素的居中是一个常见但也常被低估的挑战。无论是在传统的网页布局中还是在响应式设计中&#xff0c;居中…

【linux】输出重定向 >output.log

在 Python 开发过程中&#xff0c;我们经常需要在命令行中执行 Python 脚本&#xff0c;并将输出内容保存到日志文件中。在 Unix-like 系统中&#xff08;如 Linux 和 macOS&#xff09;&#xff0c;我们可以使用重定向操作符 > 和 2>&1 来实现这一目标。本文将详细介…

Android中常用的注解

序列化和反序列化 序列化是指将对象转换为字节序列的过程&#xff0c;以便于存储或传输。在序列化过程中&#xff0c;对象的状态信息将被转换为字节流&#xff0c;可以保存到文件中或通过网络传输给其他计算机。反序列化则是将字节序列恢复为对象的过程。 gson解析 Gson是Goog…

实习记录小程序|基于SSM的实习记录小程序设计与实现(源码+数据库+文档)

知识管理 目录 基于SSM的习记录小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 1、小程序端&#xff1a; 2、后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕…

【强化学习实践】Gym+倒立单摆+创建自己的环境

一、Gym Gym是OpenAI开发的一个强化学习算法测试环境集合包。Gym提供了多种标准的环境&#xff0c;包括经典的游戏&#xff08;如Atari游戏&#xff09;、机器人模拟任务以及其他各种类型的问题&#xff0c;供开发者测试和训练强化学习智能体。在Gym环境中&#xff0c;开发者可…