面试热题(反转字符串中的单词)

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

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

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

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

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

       看到图片中的操作,我觉得我们的第一印象应该是先用Stirng()中的方法tirm()将字符串两边的空白字符给去掉,然后再用toCharArray()方法将字符转换为char数组,然后再倒叙遍历数组填充到一个新的字符串中去,这道题就结束了,可是真的是这样么?

public String reverseWords(String s) {if(s.length()==0){return "";}//去掉两边的空格s=s.trim();//trim函数需要返回一个新的字符串,这里千万别忘记//根据“”进行分割String[] str=s.split(" ");String s1="";for (int i = str.length-1; i>=0; i--) {if(i==0){s1+=str[i];}else{s1+=str[i]+" ";}}s1=s1.trim();return s1;}

       原来这个题目中测试案例字符串中中间间隔的不一定只有一个空字符串,甚至有多个空字符串,所以我们就要对正则表达式中的规则进行一点改变

String[] str=s.split("\\s+");//匹配多个空白字符

 过程是痛苦的但是结局确实好的

接下来给大家介绍一种比较高效的方法解决本题(双指针)

       这时候有很多人就会要问了?如果遍历字符串的话,每个指针只能指向一个字符,反转的话只能使一个字符进行翻转,怎么样才可以做到对整个单词进行翻转呢?一个指针当然只可以指向一个字符了,但是两个指针就可以确定一个单词,我们可以寻找空格的位置去确定我们单词的位置

 我们做的前提得是两边没有空格的字符串,所以我们首先用String类中的trim()函数进行去除

 //去掉两边的空格String s1=s.trim();

在操作字符串的时候,我们经常将String类型转换为StringBuilder类型进行字符串的操作

StringBuilder res=new StringBuilder();

       因为我们需要进行对原字符串进行反转,干脆我们一开始就从最后面开始,这样可以省去一次翻转的时间

int i=s1.length()-1;
int j=i;
while(i>=0){...}

因为我们的字符串两边没有空格,所以我们依靠中间两个单词之间的空格来确定单词的界限

while(i>=0&&s1.charAt(i)!=' '){i--;}

       因为我们要将这个字符串截取出来,将其加入到StringBuilder中,substring(start,end)函数,是一个左闭右开的取值范围

res.append(s1.substring(i+1,j+1)+" ");

如果两个单词间隔许多空格的话,我们需要跳过这些空格,去寻找下一个单词的末尾字符

 while(i>=0&&s1.charAt(i)==' '){i--;}

同步j指针,说明找到了一个新的单词,重复上面的步骤

j=i;

 源代码如下:

 public String reverseWords(String s) {if(s.length()==0){return "";}//去掉两边的空格String s1=s.trim();StringBuilder res=new StringBuilder();int i=s1.length()-1;int j=i;while(i>=0){while(i>=0&&s1.charAt(i)!=' ')i--;res.append(s1.substring(i+1,j+1)+" ");while(i>=0&&s1.charAt(i)==' ')i--;j=i;}return res.toString().trim();}

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

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

相关文章

JVM——栈和堆概述,以及有什么区别?

方法栈 方法栈并不是某一个 JVM 的内存空间,而是我们描述方法被调用过程的一个逻辑概念。 在同一个线程内,T1()调用T2(): T1()先开始,T2()后开始;T2()先结束,T1()后结束。 堆和栈概述 从英文单词角度来…

Maven介绍,部署在eclipse中

目录 一.Maven介绍 1,什么是maven? 2. 为什么maven会在企业中大量使用? 3.没有使用maven的前后区别? 4.maven在Java开发中的实际效果图 二.maven部署在eclipse中 1.下载maven在其官方网址下载(当然实际下载也要根据个人的…

服务器安装Tomcat

下载Tomcat 下载地址在这: Tomcat官网 下载完成以后把压缩包上传到服务器中(我传到了www/java),进行解压(解压到),如果没有进行指定解压到哪里,默认是到root文件夹中 tar -zxvf /www/java/apache-tomcat-9.0.103.tar.…

统计学补充概念03-核密度估计

概念 核密度估计(Kernel Density Estimation,简称 KDE)是一种非参数统计方法,用于估计随机变量的概率密度函数(Probability Density Function,PDF)。它通过在每个数据点周围放置核函数&#xf…

day 10 | 232.用栈实现队列、 225. 用队列实现栈

目录&#xff1a; 解题及思路学习 232.用栈实现队列 https://leetcode.cn/problems/implement-queue-using-stacks/ 模拟题&#xff0c;用两个栈来实现队列的功能。 class MyQueue { public:stack<int> stIn;stack<int> stOut;/** Initialize your data struc…

HCIP学习--BGP3

目录 前置内容 BGP下一跳的修改问题 BGP的属性 配置 PrefVal权重属性 负载分担 LocPrf 负载分担 NextHop AS-PATH Ogn 配置 MED 配置 BGP选路规则 BGP的社团属性 配置及解释 前置内容 HCIP学习--BGP1_板栗妖怪的博客-CSDN博客 HCIP学习--BGP2_板栗妖怪的博客…

031_小驰私房菜_MTK平台Camera基本流程,日志信息打印

这篇文章主要介绍mtk平台,camera基本流程的日志信息打印。针对下面几点展开: 一) camera打开流程; 二) 帧请求 && 帧回调; 三) 拍照; MTK平台camera模块,如果想要打开更多日志,一般需要先设置 adb shell setprop "vendor.debug.camera.log" 1 然后…

STM32控制SG90舵机原理及代码

STM32控制SG90舵机原理及代码 一.SG90舵机原理二.控制SG90舵机三.代码实例3.1 配置定时器3.2 main 函数 四.实验现象 一.SG90舵机原理 舵机的运用还是比较广泛的&#xff0c;那么舵机工作原理是什么呢&#xff0c;一般来说我们给舵机一个信号他就能工作了&#xff0c;那么这个…

00 - 环境配置

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. 环境说明2. 安装配置2.1 配置user信息2.2 config的三个作用域 3. 建git仓库3.1 把已有的项目代码纳入git管理3.2 新建的项目直接用git管理3.3 配置local的user和email3.4 优先级&…

Redis_缓存1_缓存类型

14.redis缓存 14.1简介 穿透型缓存&#xff1a; 缓存与后端数据交互在一起&#xff0c;对服务端的调用隐藏细节。如果从缓存中可以读到数据&#xff0c;就直接返回&#xff0c;如果读不到&#xff0c;就到数据库中去读取&#xff0c;从数据库中读到数据&#xff0c;也是先更…

股票指数——RSI指数

RSI指数的计算非常简单&#xff0c;就是使用一段时间内的平均上涨除以平均上涨加平均下跌&#xff08;取正值&#xff09;。也就意味着RSI指数的取值是[0,100]之间&#xff0c;其中0表示周期内没有上涨的&#xff0c;100表示周期内没有下跌的。RSI的直观意义是它表示了一段周期…

学习笔记整理-JS-06-函数

一、函数基本使用 1. 什么是函数 函数就是语句的封装&#xff0c;可以让这些代码方便地被复用。函数具有"一次定义&#xff0c;多次调用"的优点。使用函数&#xff0c;可以简化代码&#xff0c;让代码更具有可读性。 2. 函数的定义和调用 和变量类似&#xff0c;函…

Jupyter并发测试以后出现EOFError marshal data too short

Jupyter 并发测试以后出现EOFError: marshal data too short 背景 由于项目需求需要用户能进行网页在线运行python代码程序&#xff0c;调研后决定使用Jupyter的服务接口实现此功能&#xff0c;目前使用docker进行容器化部署&#xff0c;测试针对次服务进行并发测试。测试并发…

JimuReport积木报表 v1.6.0版本发布—免费的可视化报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

开源代码分享(13)—整合本地电力市场与级联批发市场的投标策略(附matlab代码)

1.引言 1.1摘要 本地电力市场是在分配层面促进可再生能源的效率和使用的一种有前景的理念。然而&#xff0c;作为一个新概念&#xff0c;如何设计和将这些本地市场整合到现有市场结构中&#xff0c;并从中获得最大利润仍然不清楚。在本文中&#xff0c;我们提出了一个本地市场…

中睿天下Coremail | 2023年第二季度企业邮箱安全态势观察

今日&#xff0c;中睿天下联合Coremail邮件安全发布《2023第二季度企业邮箱安全性研究报告》&#xff0c;对2023第二季度和2023上半年的企业邮箱的安全风险进行了分析。 一 垃圾邮件同比下降16.38% 根据监测&#xff0c;2023年Q2垃圾邮件数量达到6.47亿封&#xff0c;环比下降…

003-Spring boot 启动流程分析

目录 启动流程分析创建 SpringApplication启动 run(String... args) 启动流程分析 SpringApplication.run(App.class, args);return new SpringApplication(primarySources).run(args);创建 SpringApplication SpringApplication(primarySources):this.primarySources new L…

opencv图片灰度二值化

INCLUDEPATH D:\work\opencv_3.4.2_Qt\include LIBS D:\work\opencv_3.4.2_Qt\x86\bin\libopencv_*.dll #include <iostream> #include<opencv2/opencv.hpp> //引入头文件using namespace cv; //命名空间 using namespace std;//opencv这个机器视…

Springloc和aop的基础概念

什么是控制反转和依赖注入&#xff1f; 控制反转(IoC)和依赖注入(DI)是软件开发中常用的编程范式&#xff0c; 它们极大地提高了代码可维护性和可复用性&#xff0c;简化了代码结构。 什么是控制反转(IoC) 控制反转是- - 种编程模式&#xff0c;它将应用程序中的控制权转移到…

使用 SSL/TLS 加强 MQTT 通信安全

在之前的文章中&#xff0c;我们探讨了认证和访问控制机制。接下来&#xff0c;我们将介绍传输层安全协议&#xff08;TLS&#xff09;在提升 MQTT 通信安全方面的重要作用。本文将着重介绍 TLS 以及它如何保证 MQTT 通信的完整性、机密性和真实性。 概念解释 在开始之前&…