面試熱題(反轉字符串中的單詞)

給你一個字符串?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.pswp.cn/news/35980.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35980.shtml
英文地址,請注明出處:http://en.pswp.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 通信的完整性、機密性和真實性。 概念解釋 在開始之前&…