最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

問題描述

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

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

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

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

原題鏈接

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

解題思路

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

代碼實現(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ù)量小于k,就全部反轉(zhuǎn);剩下數(shù)量大于k,就反轉(zhuǎn)前k
            string::iterator rightend =(left + k)<s.end() ? (left + k) : s.end();

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

復(fù)雜度分析

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

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

總結(jié)

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

相關(guān)文章

  • 詳談c++11 final與override說明符

    詳談c++11 final與override說明符

    下面小編就為大家?guī)硪黄斦刢++11 final與override說明符。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++代碼改造為UTF-8編碼問題的總結(jié)(最新推薦)

    C++代碼改造為UTF-8編碼問題的總結(jié)(最新推薦)

    本文總結(jié)了如何將C++程序代碼改造為UTF-8編碼,包括操作系統(tǒng)、編譯器和終端等各方面的設(shè)置,在實際操作中,可以通過漸進(jìn)式更新的方式,只在新的代碼項目中使用UTF-8編碼,避免大規(guī)模修改舊代碼,感興趣的朋友一起看看吧
    2025-02-02
  • C語言?詳解如何刪除有序數(shù)組中的重復(fù)項

    C語言?詳解如何刪除有序數(shù)組中的重復(fù)項

    數(shù)組不擅長插入(添加)和刪除元素。數(shù)組的優(yōu)點在于它是連續(xù)的,所以查找數(shù)據(jù)速度很快。但這也是它的一個缺點。正因為它是連續(xù)的,所以當(dāng)插入一個元素時,插入點后所有的元素全部都要向后移;而刪除一個元素時,刪除點后所有的元素全部都要向前移
    2022-03-03
  • C++ typeid 和虛函數(shù)詳解

    C++ typeid 和虛函數(shù)詳解

    這篇文章主要介紹了c++ typeid 和虛函數(shù)的使用,幫助大家更好的理解和使用c++,感興趣的朋友可以了解下,希望能夠給你帶來幫助
    2021-09-09
  • C程序結(jié)構(gòu)的入門

    C程序結(jié)構(gòu)的入門

    在我們學(xué)習(xí) C 語言的基本構(gòu)建塊之前,讓我們先來看看一個最小的 C 程序結(jié)構(gòu),在接下來的章節(jié)中可以以此作為參考
    2021-06-06
  • 關(guān)于win32 gettimeofday替代方案

    關(guān)于win32 gettimeofday替代方案

    下面小編就為大家?guī)硪黄P(guān)于win32 gettimeofday替代方案。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++的optional用法實例詳解

    C++的optional用法實例詳解

    編程中我們可能會遇到要處理可能為空的變量,比如說容器,基本類型,或者說對象實例,下面通過實例代碼介紹C++的optional用法,感興趣的朋友一起看看吧
    2024-02-02
  • C++封裝線程類的實現(xiàn)方法

    C++封裝線程類的實現(xiàn)方法

    這篇文章主要介紹了C++封裝線程類的實現(xiàn)方法,實例介紹了針對線程的創(chuàng)建、調(diào)用等方法的封裝操作,需要的朋友可以參考下
    2014-10-10
  • C語言實現(xiàn)猜數(shù)字游戲

    C語言實現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)猜數(shù)字游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • C++代碼實現(xiàn)掃雷游戲

    C++代碼實現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C++代碼實現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論

长寿区| 扎兰屯市| 宝丰县| 深水埗区| 青岛市| 中西区| 治县。| 临湘市| 灵武市| 迁西县| 娱乐| 鹿泉市| 恭城| 西和县| 塘沽区| 科尔| 北京市| 屏东县| 郁南县| 海盐县| 克山县| 辛集市| 揭西县| 玉环县| 太和县| 海兴县| 阳江市| 锡林浩特市| 白水县| 凌云县| 台湾省| 河南省| 江孜县| 宜丰县| 伽师县| 菏泽市| 德昌县| 三江| 漯河市| 宜宾市| 邯郸市|