旋轉(zhuǎn)字符串

旋轉(zhuǎn)字符串

題目描述:

給定一個(gè)字符串柱锹,要求把字符串前面的若干個(gè)字符移動(dòng)到字符串的尾部,如把字符串“abcdef”前面的2個(gè)字符'a'和'b'移動(dòng)到字符串的尾部丰包,使得原字符串變成字符串“cdefab”禁熏。請(qǐng)寫一個(gè)函數(shù)完成此功能,要求對(duì)長(zhǎng)度為n的字符串操作的時(shí)間復(fù)雜度為 O(n)邑彪,空間復(fù)雜度為 O(1)瞧毙。

分析和解法:

解法一:暴力位移法

首先,我看到題目的第一個(gè)想法就是可以通過暴力一位一位的挪移來(lái)實(shí)現(xiàn)題目要求寄症。
源代碼如下:

#include <iostream>
#include <cstring>

using namespace std;
 
void LeftShiftOne(char* s, int n)    //完成當(dāng)前字符串的第一個(gè)字符到尾部 
{
    char t = s[0];   //保存當(dāng)前字符串的第一個(gè)字符 
    for (int i = 1; i < n; i++)
    {
        s[i - 1] = s[i];
    }
    s[n - 1] = t;
}

int main()
{
    char str[100];
    int m; 
    cin.getline(str,100);  //用于輸入一行字符串宙彪,普通cin最多輸入“ abcd”
    cin>>m;
    while(m--)
    {
        LeftShiftOne(str, strlen(str));
    }
    cout<<str<<endl;
    return 0;
}

分析:針對(duì)長(zhǎng)度為n的字符串來(lái)說(shuō),假設(shè)需要移動(dòng)m個(gè)字符到字符串的尾部有巧,那么總共需要 m*n 次操作释漆,同時(shí)設(shè)立一個(gè)變量保存第一個(gè)字符,如此篮迎,時(shí)間復(fù)雜度為O(m * n)男图,空間復(fù)雜度為O(1)示姿,空間復(fù)雜度符合題目要求,但時(shí)間復(fù)雜度不符合逊笆,所以栈戳,得需要尋找其他更好的辦法來(lái)降低時(shí)間復(fù)雜度。

解法二:三步反轉(zhuǎn)法

(這個(gè)方法是我從書上學(xué)到的难裆,我一開始也沒想到子檀。。差牛。)
將一個(gè)字符串分成X和Y兩個(gè)部分命锄,在每部分字符串上定義反轉(zhuǎn)操作,如XT偏化,即把X的所有字符反轉(zhuǎn)(如脐恩,X="abc",那么XT="cba")侦讨,那么就得到下面的結(jié)論:(XTYT)^T=YX驶冒,顯然就解決了字符串的反轉(zhuǎn)問題。

例如韵卤,字符串 abcdef 骗污,若要讓def翻轉(zhuǎn)到abc的前頭,只要按照下述3個(gè)步驟操作即可:

  • 首先將原字符串分為兩個(gè)部分沈条,即X:abc需忿,Y:def;
  • 將X反轉(zhuǎn)蜡歹,X->XT屋厘,即得:abc->cba;將Y反轉(zhuǎn)月而,Y->YT汗洒,即得:def->fed。
  • 反轉(zhuǎn)上述步驟得到的結(jié)果字符串XTYT父款,即反轉(zhuǎn)字符串cbafed的兩部分(cba和fed)給予反轉(zhuǎn)溢谤,cbafed得到defabc,形式化表示為(XTYT)^T=YX憨攒,這就實(shí)現(xiàn)了整個(gè)反轉(zhuǎn)世杀。
    源代碼如下:
#include <iostream>
#include <cstring>

using namespace std;
 
void MyReverse(char* s, int from, int to)   //自身反轉(zhuǎn) 
{
    while(from < to)
    {
        char t = s[from];
        s[from++] = s[to];
        s[to--] = t;
    }
}

int main()
{
    char str[100];
    int n,m;
    cin.getline(str, 100);
    cin>>m;
    n = strlen(str);
    MyReverse(str, 0, m-1);
    MyReverse(str, m, n-1);
    MyReverse(str, 0, n-1);
    cout<<str<<endl;
    return 0;
}

分析:這就是把字符串分為兩個(gè)部分,先各自反轉(zhuǎn)再整體反轉(zhuǎn)的方法肝集,時(shí)間復(fù)雜度為O(n)玫坛,空間復(fù)雜度為O(1),達(dá)到了題目的要求包晰。

特別注意:

  • <string.h>是舊的C 頭文件湿镀,對(duì)應(yīng)的是基于char*的字符串處理函數(shù),并無(wú)類伐憾,所以不能 string s1
  • <cstring>是對(duì)應(yīng)于舊C 頭文件的std 版本勉痴,實(shí)際上只是在一個(gè)命名空間std中include了 <string.h>
  • <string>是包裝了std 的C++頭文件,對(duì)應(yīng)的是新的string 類树肃,string s1就是建立一個(gè)string類的對(duì)象
  • 漢字之所以亂碼蒸矛, 是因?yàn)闈h字是多字節(jié)的, 如果采用單字節(jié)翻轉(zhuǎn)胸嘴,必然就亂碼了雏掠。你需要判斷漢字是幾個(gè)字節(jié)(N), 然后整體翻轉(zhuǎn)移動(dòng)這N個(gè)字節(jié)
  • 這里我還想說(shuō)明一下關(guān)于C++輸入輸出流的問題劣像,有興趣的可以看一下C/C++輸入輸出流總結(jié)

參考資料:《編程之法》The Art of Programming By July

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乡话,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耳奕,更是在濱河造成了極大的恐慌绑青,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屋群,死亡現(xiàn)場(chǎng)離奇詭異闸婴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芍躏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門邪乍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人对竣,你說(shuō)我怎么就攤上這事庇楞。” “怎么了柏肪?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵姐刁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我烦味,道長(zhǎng)聂使,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任谬俄,我火速辦了婚禮柏靶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘溃论。我一直安慰自己屎蜓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布钥勋。 她就那樣靜靜地躺著炬转,像睡著了一般辆苔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扼劈,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天凳厢,我揣著相機(jī)與錄音且蓬,去河邊找鬼悬荣。 笑死入撒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的先煎。 我是一名探鬼主播贼涩,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼薯蝎!你這毒婦竟也來(lái)了遥倦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤良风,失蹤者是張志新(化名)和其女友劉穎谊迄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體烟央,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡统诺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疑俭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粮呢。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖钞艇,靈堂內(nèi)的尸體忽然破棺而出啄寡,到底是詐尸還是另有隱情,我是刑警寧澤哩照,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布挺物,位于F島的核電站,受9級(jí)特大地震影響飘弧,放射性物質(zhì)發(fā)生泄漏识藤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一次伶、第九天 我趴在偏房一處隱蔽的房頂上張望痴昧。 院中可真熱鬧,春花似錦冠王、人聲如沸赶撰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豪娜。三九已至餐胀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瘤载,已是汗流浹背骂澄。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惕虑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓磨镶,卻偏偏與公主長(zhǎng)得像溃蔫,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琳猫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 題目描述 原文地址給定一個(gè)字符串伟叛,要求把字符串前面的若干個(gè)字符移動(dòng)到字符串的尾部,如把字符串“abcdef”前面的...
    王尼小老板閱讀 863評(píng)論 0 4
  • 版權(quán)聲明:本文為博主原創(chuàng)文章脐嫂,未經(jīng)博主允許不得轉(zhuǎn)載统刮。 難度:容易 要求: 給定一個(gè)字符串和一個(gè)偏移量,根據(jù)偏移量旋...
    柒黍閱讀 1,586評(píng)論 0 1
  • 1. 旋轉(zhuǎn)字符串 給定一個(gè)字符串账千,要求把字符串前面的若干個(gè)字符移動(dòng)到字符串的尾部侥蒙,如把字符串“abcdef”前面的...
    HongMok閱讀 430評(píng)論 0 0
  • 一年級(jí)語(yǔ)文上冊(cè)生字表 生字表一(共400字) 啊(ā)愛(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang閱讀 2,796評(píng)論 0 6
  • “每個(gè)當(dāng)下和一日三餐是最高信仰”,是的匀奏,沒錯(cuò)鞭衩,從2016年5月份開始,直到最后成功減掉20斤以來(lái)娃善,一日三餐確實(shí)變...
    我的小宇宙閱讀 621評(píng)論 2 0