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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ string與int的相互轉(zhuǎn)換(使用C++11)
本文主要介紹了C++ string與int的相互轉(zhuǎn)換(使用C++11),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Qt中QList與QLinkedList類的常用方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Qt中QList與QLinkedList類的常用方法,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下2022-12-12VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程
這篇文章主要介紹了VC實(shí)現(xiàn)獲取當(dāng)前正在運(yùn)行的進(jìn)程,涉及VC針對系統(tǒng)進(jìn)程的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05C++構(gòu)造函數(shù)初始化列表的實(shí)現(xiàn)詳解
構(gòu)造函數(shù)主要作用在于創(chuàng)建對象時(shí)為對象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無須手動(dòng)調(diào)用;析構(gòu)函數(shù)主要作用在于對象銷毀前系統(tǒng)自動(dòng)調(diào)用,執(zhí)行一 些清理工作2022-09-09C++?AVL樹插入新節(jié)點(diǎn)后的四種調(diào)整情況梳理介紹
AVL樹是高度平衡的而二叉樹,它的特點(diǎn)是AVL樹中任何節(jié)點(diǎn)的兩個(gè)子樹的高度最大差別為1,本文主要給大家介紹了C++如何實(shí)現(xiàn)AVL樹,需要的朋友可以參考下2022-08-08C++使用printf語句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼
在C語言中,printf 函數(shù)可以直接實(shí)現(xiàn)部分進(jìn)制轉(zhuǎn)換功能,通過格式說明符(format specifier)快速輸出不同進(jìn)制的數(shù)值,下面給大家分享C++使用printf語句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼,感興趣的朋友一起看看吧2025-04-04