【C++經典例題】反轉字符串中單詞的字符順序:兩種實現方法詳解

???????????💓 博客主頁:倔強的石頭的CSDN主頁?

???????????📝Gitee主頁:倔強的石頭的gitee主頁

? ? ? ? ? ? ? 文章專欄:C++經典例題

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????期待您的關注

?

目錄

問題描述

基于快慢指針的解法

基于索引的解法

兩種方法的比較


?

問題描述

在處理字符串相關的問題時,反轉字符串中每個單詞的字符順序是一個常見的任務,同時要保證空格和單詞的初始順序不變。

?

給定一個字符串?s?,你需要反轉字符串中每個單詞的字符順序,同時仍保留空格和單詞的初始順序。

  • s?包含可打印的?ASCII?字符。
  • s?不包含任何開頭或結尾空格。
  • s?里?至少?有一個詞。
  • s?中的所有單詞都用一個空格隔開。

原題鏈接:557. 反轉字符串中的單詞 III - 力扣(LeetCode)

下面我們將詳細介紹兩種解決該問題的方法,包括其解題思路和具體實現細節。

?


基于快慢指針的解法


1. 解題思路


快慢指針是一種常用的技巧,在本題中,快指針用于遍歷字符串,慢指針用于標記每個單詞的起始位置。

當快指針遇到空格時,就表示一個單詞已經遍歷完,此時可以對慢指針到快指針之間的字符進行反轉。

遍歷完整個字符串后,還需要對最后一個單詞進行反轉,因為最后一個單詞后面沒有空格來觸發反轉操作。同時,這也對只要一個單詞的情況進行了處理

?


2. 代碼實現

class Solution {
public:string reverseWords(string s) //快慢指針解法{string::iterator fast = s.begin();string::iterator slow = s.begin();while( fast != s.end() )//快指針走完就結束{if(*fast==' ') //快指針走到空格位置停下,反轉該部分字母{reverse(slow,fast);slow = fast+1;}++fast;}reverse(slow,fast);//出循環時,慢指針留在最后一個單詞的第一個字母//快指針在\0位置,還需要反轉一次//同時可以對只要一個單詞的string處理return s;}
};


3. 代碼細節分析

  • 指針初始化:首先定義了快指針 fast 和慢指針 slow,并將它們都初始化為字符串 s 的起始位置 s.begin()。
  • 遍歷字符串:通過 while 循環,只要快指針 fast 沒有到達字符串末尾 s.end(),就繼續循環。
  • 單詞反轉:當快指針 fast 指向的字符為空格時,說明一個單詞已經遍歷完,此時調用 reverse 函數將慢指針 slow 到快指針 fast 之間的字符進行反轉。然后將慢指針 slow 移動到下一個單詞的起始位置,即 fast + 1。
  • 最后一個單詞處理:循環結束后,慢指針 slow 停留在最后一個單詞的起始位置,快指針 fast 指向字符串末尾的下一個位置(即 \0 的位置),此時再調用一次 reverse 函數對最后一個單詞進行反轉。
  • 返回結果:最后返回反轉后的字符串 s。

?

基于索引的解法


1. 解題思路

這種方法使用索引來遍歷字符串,通過一個變量記錄每個單詞的起始位置,當遇到空格或者字符串結束時,對當前單詞進行反轉。


2. 代碼實現

#include <iostream>
#include <string>
#include <algorithm>class Solution {
public:string reverseWords(string s) {int start = 0; // 慢指針,標記每個單詞的起始位置for (int end = 0; end <= s.length(); ++end) {// 當遇到空格或者字符串結束時,反轉當前單詞if (end == s.length() || s[end] == ' ') {// 反轉從 start 到 end - 1 的字符std::reverse(s.begin() + start, s.begin() + end);// 更新慢指針到下一個單詞的起始位置start = end + 1;}}return s;}
};


3. 代碼細節分析

  • 起始位置初始化:定義變量 start 來記錄每個單詞的起始位置,初始化為 0。
  • 遍歷字符串:通過 for 循環,使用變量 end 遍歷字符串 s,循環條件為 end <= s.length(),這樣可以確保在字符串結束時也能處理最后一個單詞。
  • 單詞反轉:當 end 等于字符串的長度 s.length() 或者 s[end] 為空格時,說明一個單詞已經遍歷完,此時調用 std::reverse 函數將從 s.begin() + start 到 s.begin() + end 的字符進行反轉。
  • 更新起始位置:反轉完當前單詞后,將 start 更新為 end + 1,即下一個單詞的起始位置。
  • 返回結果:循環結束后,返回反轉后的字符串 s。

?

兩種方法的比較

?

  • 時間復雜度:兩種方法的時間復雜度都是?O(n),其中?n?是字符串的長度,因為都需要遍歷字符串一次,并且每個字符最多被反轉一次。
  • 空間復雜度:兩種方法的空間復雜度都是?O(1),因為都只使用了常數級的額外空間。
  • 代碼可讀性:基于索引的方法代碼相對更加簡潔,使用索引來處理字符串更加直觀,而基于快慢指針的方法需要對指針的操作有較好的理解


通過以上兩種方法的詳細介紹,我們可以根據具體的需求和個人習慣選擇合適的方法來解決反轉字符串中單詞字符順序的問題。

?

?

?

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898119.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898119.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898119.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java基礎語法練習45(網絡編程)

目錄 一、網絡的相關概念 1.網絡通信 2.網絡 3.ip 地址 4.ipv4 地址分類 5.域名 6.網絡通信協議 7.TCP 和 UDP 二、InetAddress類 1.相關方法 2.代碼示例如下&#xff1a; 三、Socket 1.基本介紹 四、TCP 網絡通信編程 1.基本介紹 2.應用示例&#xff1a; 2.1…

【Json—RPC框架】:宏定義不受命名空間限制,續行符的錯誤使用造成的bug

為什么不受命名空間的限制&#xff1f; 宏處理在預處理階段&#xff0c; 預處理在編譯之前&#xff0c;編譯才進行語法分析&#xff0c;語義分析。命名空間也只能限制這部分。 在Json-RPC框架的實現中&#xff0c;遇到如下問題。一開始以為是在實現日志宏的時候&#xff0c;有…

四川省包含哪些水系

背景&#xff1a; 想知道四川省包含哪些水系&#xff0c;以及各個水系的分布&#xff0c;起點、流經省市、終點等 {label: "嘉陵江",value: "嘉陵江",},{label: "渠江",value: "渠江",},{label: "涪江",value: "涪江&q…

子序列問題寫法

子序列問題可以按照動態規劃的思想去寫。 子序列問題類型 子序列 是由數組派生而來的序列&#xff0c;刪除&#xff08;或不刪除&#xff09;數組中的元素而不改變其余元素的順序。 例如&#xff0c;[3,6,2,7] 是數組 [0,3,1,6,2,2,7] 的子序列。 寫法思路 創建兩層for循環…

C++ primer plus 使用類下

目錄 前言 一 轉換函數 總結 前言 接著上一章的內容 一 轉換函數 接著我們上一章節的內容&#xff0c;我們知道我們類里面有一個自動轉換利用這個運算符&#xff0c;這樣就可以使得對象可以接受這個值 那么有沒有可以使一個普通類型去接收一個對象呢&#xff1f; 答案是…

聲網自研算法如何重定義AI交互容災標準

在咖啡廳里&#xff0c;當我把手機置于咖啡機與微波爐形成的電磁干擾區時&#xff0c;WiFi丟包率飆升至83%&#xff0c;但AI的回應延遲僅從1.2秒增至1.4秒。這背后是聲網自研的Phoenix抗弱網算法在發揮作用&#xff0c;通過AI驅動的動態FEC&#xff08;前向糾錯&#xff09;機制…

詳解布隆過濾器及其模擬實現

目錄 布隆過濾器 引入 概念 工作原理 模擬實現布隆過濾器 哈希函數集 布隆過濾器基本框架 add函數&#xff08;添加到布隆過濾器中&#xff09; contains函數&#xff08;判斷是否存在該值&#xff09; 完整代碼 布隆過濾器的刪除 布隆過濾器的誤判率 布隆過濾器的…

巧用 VSCode 與 AI 編碼提升 Vue 前端開發效率

在當今快節奏的軟件開發領域&#xff0c;提升開發效率是每個開發者都追求的目標。對于 Vue 前端開發而言&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已經成為了眾多開發者的首選編輯器。而隨著人工智能技術的發展&#xff0c;各類 AI 編碼擴展工具如雨后春筍…

5分鐘快速申請一個EDU教育郵箱

感謝CSDN作者 CodeDevMaster 于 2023-10-16 13:22:40 發布作品《5分鐘快速申請一個EDU教育郵箱》 本文內容為作者方法的實踐與復刻&#xff0c;同時 現在是2025/03/17&#xff0c;執行的細節有部分變動&#xff0c;所以完整展示一波。 祝各位好運&#xff0c;同時本案例中展示…

Go string 字符串底層邏輯

在 Go 語言中&#xff0c;string 類型的底層結構是一個結構體&#xff0c;包含兩個字段&#xff1a;一個指向字節數組的指針和該字節數組的長度。以下是其在 Go 源碼中的大致定義&#xff1a;type stringStruct struct {str unsafe.Pointerlen int } str&#xff1a;這是一個指…

【NLP】10. 機器學習模型性能評估指標(含多類別情況), ROC,PRC

機器學習模型性能評估指標&#xff08;含多類別情況&#xff09; 1. 模型評估指標簡介 在機器學習中&#xff0c;模型的性能評估非常重要。常用的模型評估指標有&#xff1a; 準確率&#xff08;Accuracy&#xff09;精度&#xff08;Precision&#xff09;召回率&#xff0…

開源通義萬相本地部署方案,文生視頻、圖生視頻、視頻生成大模型,支持消費級顯卡!

開源通義萬相本地部署方案&#xff0c;文生視頻、圖生視頻、視頻生成大模型&#xff0c;支持消費級顯卡&#xff01; 萬相2.1開源 近日&#xff0c;大模型萬相2.1&#xff08;Wan&#xff09;重磅開源&#xff0c;此次開源采用Apache2.0協議&#xff0c;14B和1.3B兩個參數規格…

機器學習與深度學習中模型訓練時常用的四種正則化技術L1,L2,L21,ElasticNet

L1正則化和L2正則化是機器學習中常用的兩種正則化方法&#xff0c;用于防止模型過擬合。它們的區別主要體現在數學形式、作用機制和應用效果上。以下是詳細對比&#xff1a; 1. 數學定義 L1正則化&#xff08;也叫Lasso正則化&#xff09;&#xff1a; 在損失函數中加入權重參…

qt+opengl 播放yuv視頻

一、實現效果 二、pro文件 Qt widgets opengl 三、主要代碼 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

Android開源庫——RxJava和RxAndroid

RxJava和RxAndroid是什么&#xff1f; RxJava是基于JVM的響應式擴展&#xff0c;用于編寫異步代碼 RxAndroid是關于Android的RxJava綁定 RxJava和RxAndroid使用 依賴 implementation io.reactivex.rxjava3:rxjava:3.1.0 implementation io.reactivex.rxjava3:rxandroid:3.…

并發基礎—三大問題:可見性、原子性、有序性

文章目錄 可見性原子性有序性&#xff08;指令重排&#xff09;經典的指令重排案例&#xff1a;單例模式的雙重檢查鎖volatile和synchronize都可以保證有序性并發壓測工具Jcstress證明指令重排會在多線程下出現問題&#xff08;了解&#xff09;CPU緩存分為三個級別&#xff1a…

PyTorch 入門學習

目錄 PyTorch 定義 核心作用 應用場景 Pytorch 基本語法 1. 張量的創建 2. 張量的類型轉換 3. 張量數值計算 4. 張量運算函數 5. 張量索引操作 6. 張量形狀操作 7. 張量拼接操作 8. 自動微分模塊 9. 案例-線性回歸案例 PyTorch 定義 PyTorch 是一個基于 Python 深…

Hive SQL 精進系列:REGEXP_REPLACE 函數的用法

目錄 一、引言二、REGEXP_REPLACE 函數基礎2.1 基本語法參數詳解2.2 簡單示例 三、REGEXP_REPLACE 函數的應用場景3.1 去除特殊字符3.2 統一字符串格式 四、REGEXP_REPLACE 與 REPLACE 函數的對比4.1 功能差異4.2 適用場景 五、REGEXP_REPLACE 與 REGEXP 函數的對比5.1 功能差異…

從0開始搭建微服務架構特別篇SpringCloud網關聚合knife4j

前言&#xff1a;總所周知項目開發接口測試需要knife4j&#xff0c;但是&#xff0c;微服務架構中微服務很多&#xff0c;模塊地址很多&#xff0c;需要統一管理api測試&#xff0c;就需要聚合在網關統一調用&#xff0c;本章&#xff0c;就說明如何通過網關聚合使用knife4j。 …

Spring Cloud 中的服務注冊與發現: Eureka詳解

1. 背景 1.1 問題描述 我們如果通過 RestTamplate 進行遠程調用時&#xff0c;URL 是寫死的&#xff0c;例如&#xff1a; String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 當機器更換或者新增機器時&#xff0c;這個 URL 就需要相應地變…