C/C++左旋字符串實(shí)現(xiàn)代碼舉例
題目
實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中的k個(gè)字符。
例如:ABCD左旋一個(gè)字符得到BCDA ABCD左旋兩個(gè)字符得到CDAB。
設(shè)計(jì)循環(huán)使其可以旋1次,然后讓他執(zhí)行n次是一個(gè)最簡單的思路:
長度為5的情況下,旋轉(zhuǎn)6、11、16...次相當(dāng)于1次,7、12、17...次相當(dāng)于2次,以此類推。
void leftRound(char * src, int time)
{
int i, j, tmp;
int len = strlen(src);
time %= len;
for (i = 0; i < time; i++) //執(zhí)行k次的單次平移
{
tmp = src[0];
for(j = 0; j < len - 1; j++) //單次平移
{
src[j] = src[j + 1];
}
src[j] = tmp;
}
}改進(jìn)一:
一次一次轉(zhuǎn)比較麻煩,我們可以選擇拼接法,一次到位:
void leftRound(char * src, int time)
{
int len = strlen(src);
int pos = time % len; //斷開位置的下標(biāo)
char tmp[256] = { 0 }; //更準(zhǔn)確的話可以選擇malloc len + 1個(gè)字節(jié)的空間來做這個(gè)tmp
strcpy(tmp, src + pos); //先將后面的全部拷過來
strncat(tmp, src, pos); //然后將前面幾個(gè)接上
strcpy(src, tmp); //最后拷回去
}改進(jìn)二:
這個(gè)方法要用到一個(gè)數(shù)組形成的輔助空間,讓人覺得有點(diǎn)不爽,還可以有更好的選擇,例如ABCDEFG,左旋3次后變成DEFGABC,有一個(gè)特殊的操作方式:
先將要左旋的前三個(gè)家伙逆序(CBADEFG),然后將后半段也逆序(CBAGFED),最后整體逆序(DEFGABC)即可。這樣只需要做數(shù)值交換即可,可以寫一個(gè)函數(shù)幫我們完成局部逆序,代碼如下:
void reverse_part(char *str, int start, int end) //將字符串從start到end這一段逆序
{
int i, j;
char tmp;
for (i = start, j = end; i < j; i++, j--)
{
tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
}
void leftRound(char * src, int time)
{
int len = strlen(src);
int pos = time % len;
reverse_part(src, 0, pos - 1); //逆序前段
reverse_part(src, pos, len - 1); //逆序后段
reverse_part(src, 0, len - 1); //整體逆序
}補(bǔ)充:右旋字符串
總結(jié)
到此這篇關(guān)于C/C++左旋字符串實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C/C++左旋字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文帶你深入了解Qt中的順序容器類與關(guān)聯(lián)容器類
Qt中也有很多容器類,他們在存取速度、內(nèi)存開銷等方面進(jìn)行了優(yōu)化,使用起來更輕量級(jí)、更便捷,下面就跟隨小編一起來學(xué)習(xí)一下它們的具體使用吧2024-04-04
C語言中的一維數(shù)組與二維數(shù)組的實(shí)現(xiàn)
數(shù)組可以幫我們巧妙解決生活中的問題,使我們的代碼簡潔,本文主要介紹了C語言中的一維數(shù)組與二維數(shù)組,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
DEV?C++源碼編譯后控制臺(tái)輸出中文亂碼問題解決
本文主要介紹了DEV?C++源碼編譯后控制臺(tái)輸出中文亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
C++11/14 線程中使用Lambda函數(shù)的方法
這篇文章主要介紹了C++11/14 線程中使用Lambda函數(shù)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-01-01
C語言之結(jié)構(gòu)體定義 typedef struct 用法詳解和用法小結(jié)
這篇文章主要介紹了C語言的結(jié)構(gòu)體定義typedef struct用法詳解和用法小結(jié),typedef是類型定義,typedef struct 是為了使用這個(gè)結(jié)構(gòu)體方便,感興趣的同學(xué)可以參考閱讀2023-03-03
C語言數(shù)據(jù)結(jié)構(gòu)之單向鏈表詳解分析
鏈表可以說是一種最為基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)了,而單向鏈表更是基礎(chǔ)中的基礎(chǔ)。鏈表是由一組元素以特定的順序組合或鏈接在一起的,不同元素之間在邏輯上相鄰,但是在物理上并不一定相鄰。在維護(hù)一組數(shù)據(jù)集合時(shí),就可以使用鏈表,這一點(diǎn)和數(shù)組很相似2021-11-11

