欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++經(jīng)典例題之字符串特定規(guī)則反轉(zhuǎn)問(wèn)題的解法

 更新時(shí)間:2025年03月20日 09:24:12   作者:倔強(qiáng)的石頭_  
這篇文章主要介紹了如何解決字符串反轉(zhuǎn)問(wèn)題,通過(guò)將字符串按每2k個(gè)字符為一個(gè)區(qū)間進(jìn)行劃分,并使用雙指針?lè)椒▉?lái)確定實(shí)際反轉(zhuǎn)的邊界,最終實(shí)現(xiàn)字符串按特定規(guī)則進(jìn)行反轉(zhuǎn),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

問(wèn)題描述

在字符串處理的編程領(lǐng)域中,經(jīng)常會(huì)遇到各種復(fù)雜的規(guī)則要求。

本文將深入探討一個(gè)給定字符串 s 和整數(shù) k,按照特定規(guī)則反轉(zhuǎn)字符串的問(wèn)題。

要求從字符串開(kāi)頭算起,每計(jì)數(shù)至 2k 個(gè)字符,就反轉(zhuǎn)這 2k 字符中的前 k 個(gè)字符

  • 如果剩余字符少于 k 個(gè),則將剩余字符全部反轉(zhuǎn);
  • 如果剩余字符小于 2k 但大于或等于 k 個(gè),則反轉(zhuǎn)前 k 個(gè)字符,其余字符保持原樣

原題鏈接

541. 反轉(zhuǎn)字符串 II - 力扣(LeetCode)

解題思路

  • 區(qū)間劃分:解題的核心在于將字符串按照每 2k 個(gè)字符為一個(gè)區(qū)間進(jìn)行劃分。通過(guò)雙指針的方式,定義一個(gè)左指針 left 來(lái)標(biāo)記每個(gè)區(qū)間的起始位置,初始時(shí) left 指向字符串的開(kāi)頭 s.begin()。
  • 確定右邊界:對(duì)于每個(gè) 2k 區(qū)間,需要確定其右邊界 right。如果當(dāng)前區(qū)間有足夠的字符,即 left + 2*k 小于字符串的末尾 s.end(),那么右邊界 right 就是 left + 2*k;否則,右邊界 right 就是字符串的末尾 s.end()。這一步是為了確定一個(gè)2k區(qū)間
  • 確定實(shí)際反轉(zhuǎn)的右邊界:在每個(gè) 2k 區(qū)間內(nèi),需要進(jìn)一步確定實(shí)際反轉(zhuǎn)的右邊界 rightend。如果從 left 開(kāi)始往后數(shù) k 個(gè)字符不超過(guò)字符串末尾,即 (left + k) < s.end(),那么實(shí)際反轉(zhuǎn)的右邊界 rightend 就是 left + k;否則,實(shí)際反轉(zhuǎn)的右邊界 rightend 就是字符串的末尾 s.end()。這一步是為了滿(mǎn)足題目中關(guān)于剩余字符數(shù)量不同時(shí)的反轉(zhuǎn)規(guī)則
  • 反轉(zhuǎn)操作:確定了實(shí)際反轉(zhuǎn)的左右邊界后,使用 reverse 函數(shù)對(duì) [left, rightend) 區(qū)間內(nèi)的字符進(jìn)行反轉(zhuǎn)。
  • 移動(dòng)指針:完成一個(gè)區(qū)間的處理后,將左指針 left 移動(dòng)到當(dāng)前右邊界 right 的位置,以便處理下一個(gè) 2k 區(qū)間。重復(fù)上述步驟,直到左指針 left 到達(dá)字符串的末尾。

代碼實(shí)現(xiàn)

class Solution {
public:
    string reverseStr(string s, int k) 
    {
        string::iterator left = s.begin();//初始左區(qū)間
        

        while(left < s.end())
        {
            //初始右區(qū)間
            string::iterator right = (left + 2*k )< s.end() ?  left+ 2*k : s.end();
            
            //確定右區(qū)間的實(shí)際值
            //剩余數(shù)量小于k,就全部反轉(zhuǎn);剩下數(shù)量大于k,就反轉(zhuǎn)前k
            string::iterator rightend =(left + k)<s.end() ? (left + k) : s.end();

            reverse(left,rightend);
            
            //移動(dòng)
            left = right;
            
        }
        return s;
    }
};
  • 初始化左指針:string::iterator left = s.begin(); 這行代碼初始化了左指針 left,使其指向字符串 s 的開(kāi)頭。
  • 循環(huán)處理區(qū)間:while(left < s.end()) 循環(huán)用于遍歷整個(gè)字符串,只要左指針 left 還未到達(dá)字符串末尾,就繼續(xù)處理下一個(gè) 2k 區(qū)間。
  • 確定右邊界:string::iterator right = (left + 2*k )< s.end()? left+ 2*k : s.end(); 這行代碼根據(jù)當(dāng)前 left 的位置和 2k 的長(zhǎng)度,確定了當(dāng)前 2k 區(qū)間的右邊界 right。
  • 確定實(shí)際反轉(zhuǎn)的右邊界:string::iterator rightend =(left + k)<s.end()? (left + k) : s.end(); 這行代碼根據(jù)當(dāng)前 left 的位置和 k 的長(zhǎng)度,確定了實(shí)際需要反轉(zhuǎn)的右邊界 rightend。
  • 反轉(zhuǎn)操作:reverse(left,rightend); 這行代碼調(diào)用 reverse 函數(shù),對(duì) [left, rightend) 區(qū)間內(nèi)的字符進(jìn)行反轉(zhuǎn)。
  • 移動(dòng)左指針:left = right; 這行代碼將左指針 left 移動(dòng)到當(dāng)前右邊界 right 的位置,為處理下一個(gè) 2k 區(qū)間做準(zhǔn)備。

復(fù)雜度分析

  • 時(shí)間復(fù)雜度:由于每個(gè)字符最多被處理一次,所以時(shí)間復(fù)雜度為 O(n),其中 n 是字符串的長(zhǎng)度
  • 空間復(fù)雜度:代碼中只使用了常數(shù)級(jí)別的額外空間,如指針 left、right 和 rightend,所以空間復(fù)雜度為 O(1)

通過(guò)上述解題思路和代碼實(shí)現(xiàn),我們可以高效地解決這個(gè)字符串特定規(guī)則反轉(zhuǎn)的問(wèn)題。這種方法不僅邏輯清晰,而且在時(shí)間和空間復(fù)雜度上都達(dá)到了較好的性能。

總結(jié)

到此這篇關(guān)于C++經(jīng)典例題之字符串特定規(guī)則反轉(zhuǎn)問(wèn)題解法的文章就介紹到這了,更多相關(guān)C++字符串特定規(guī)則反轉(zhuǎn)問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中多才多藝的 const

    C++中多才多藝的 const

    在C++中,關(guān)鍵字const可以用來(lái)修飾任何作用域內(nèi)的變量、函數(shù)參數(shù)、函數(shù)本體、函數(shù)返回值、成員函數(shù)、迭代器,也可以用來(lái)修飾指針本身和指針目標(biāo),可謂多才多藝,我們要詳細(xì)了解其內(nèi)部細(xì)節(jié),以及邏輯奧秘,讓這把多功能瑞士軍刀盡情發(fā)揮其作用,需要的朋友可以參考一下
    2021-09-09
  • C語(yǔ)言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié)

    C語(yǔ)言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié)

    這篇文章主要介紹了C語(yǔ)言中socket相關(guān)網(wǎng)絡(luò)編程函數(shù)小結(jié),是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++非遞歸建立二叉樹(shù)實(shí)例

    C++非遞歸建立二叉樹(shù)實(shí)例

    這篇文章主要介紹了C++非遞歸建立二叉樹(shù)的方法,實(shí)例分析了二叉樹(shù)的原理與C++實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • Qt定時(shí)器(QTimer)的3種使用方法

    Qt定時(shí)器(QTimer)的3種使用方法

    本文主要介紹了Qt定時(shí)器(QTimer)的3種使用方法,主要包括QObject類(lèi)提供的定時(shí)器,QTimer類(lèi)提供的定時(shí)器,靜態(tài)的singleShot?()函數(shù)創(chuàng)建單觸發(fā)定時(shí)器,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    C語(yǔ)言的函數(shù)概念與規(guī)則你了解嗎

    這篇文章主要介紹了C語(yǔ)言中的函數(shù)概念與規(guī)則,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下,希望能給你帶來(lái)幫助
    2021-08-08
  • C語(yǔ)言掃雷詳細(xì)代碼分步實(shí)現(xiàn)流程

    C語(yǔ)言掃雷詳細(xì)代碼分步實(shí)現(xiàn)流程

    掃雷是電腦上很經(jīng)典的游戲,特意去網(wǎng)上玩了一會(huì),幾次調(diào)試之后,發(fā)現(xiàn)這個(gè)比三子棋要復(fù)雜一些,尤其是空白展開(kāi)算法上和堵截玩家有的一拼,與實(shí)際游戲差別較大,不能使用光標(biāo),下面來(lái)詳解每一步分析
    2022-02-02
  • C++實(shí)現(xiàn)二叉樹(shù)非遞歸遍歷算法詳解

    C++實(shí)現(xiàn)二叉樹(shù)非遞歸遍歷算法詳解

    在C++中,二叉樹(shù)非遞歸遍歷是一種常用的算法,可避免遞歸過(guò)程中的系統(tǒng)開(kāi)銷(xiāo)和棧溢出問(wèn)題。非遞歸遍歷算法利用棧數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),可以實(shí)現(xiàn)前序、中序和后序遍歷,是C++程序員必備技能之一
    2023-04-04
  • C語(yǔ)言常見(jiàn)的文件操作函數(shù)

    C語(yǔ)言常見(jiàn)的文件操作函數(shù)

    這篇文章主要為大家介紹了C語(yǔ)言文件操作函數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Visual?Studio2022的完全卸載及安裝到D盤(pán)的操作方法

    Visual?Studio2022的完全卸載及安裝到D盤(pán)的操作方法

    這篇文章主要介紹了Visual?Studio2022的完全卸載以及完全安裝到D盤(pán),因?yàn)閂S如果隨便寫(xiě)在會(huì)有很多很多的亂七八糟的東西掉出來(lái),所以我們選擇制式一點(diǎn)的卸載方式,需要的朋友可以參考下
    2022-09-09
  • QT中對(duì)Mat類(lèi)的一些操作詳解

    QT中對(duì)Mat類(lèi)的一些操作詳解

    本文主要介紹了QT中對(duì)Mat類(lèi)的一些操作詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06

最新評(píng)論