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è)最簡(jiǎn)單的思路:
長(zhǎng)度為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; //斷開(kāi)位置的下標(biāo) char tmp[256] = { 0 }; //更準(zhǔn)確的話可以選擇malloc len + 1個(gè)字節(jié)的空間來(lái)做這個(gè)tmp strcpy(tmp, src + pos); //先將后面的全部拷過(guò)來(lái) strncat(tmp, src, pos); //然后將前面幾個(gè)接上 strcpy(src, tmp); //最后拷回去 }
改進(jìn)二:
這個(gè)方法要用到一個(gè)數(shù)組形成的輔助空間,讓人覺(jué)得有點(diǎn)不爽,還可以有更好的選擇,例如ABCDEFG,左旋3次后變成DEFGABC,有一個(gè)特殊的操作方式:
先將要左旋的前三個(gè)家伙逆序(CBADEFG),然后將后半段也逆序(CBAGFED),最后整體逆序(DEFGABC)即可。這樣只需要做數(shù)值交換即可,可以寫(xiě)一個(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)文章
C++ string與int的相互轉(zhuǎn)換(使用C++11)
本文主要介紹了C++ string與int的相互轉(zhuǎn)換(使用C++11),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Qt中QList與QLinkedList類的常用方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了Qt中QList與QLinkedList類的常用方法,文中的示例代碼講解詳細(xì),對(duì)我們學(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針對(duì)系統(tǒng)進(jìn)程的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05C++構(gòu)造函數(shù)初始化列表的實(shí)現(xiàn)詳解
構(gòu)造函數(shù)主要作用在于創(chuàng)建對(duì)象時(shí)為對(duì)象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無(wú)須手動(dòng)調(diào)用;析構(gòu)函數(shù)主要作用在于對(duì)象銷毀前系統(tǒng)自動(dòng)調(diào)用,執(zhí)行一 些清理工作2022-09-09詳解windows下C/C++的內(nèi)存泄露檢測(cè)
C/C++由于其沒(méi)有垃圾回收機(jī)制,所以內(nèi)存的釋放一直以來(lái)都依靠于程序員的手工釋放,因此極其容易出現(xiàn)內(nèi)存泄露的問(wèn)題,而在比較大的程序之中,查找內(nèi)存泄露是一件比較困難的事情,所以我們需要一些簡(jiǎn)便的方法來(lái)檢測(cè)內(nèi)存泄露,避免內(nèi)存泄露導(dǎo)致設(shè)備崩潰2021-06-06C++?AVL樹(shù)插入新節(jié)點(diǎn)后的四種調(diào)整情況梳理介紹
AVL樹(shù)是高度平衡的而二叉樹(shù),它的特點(diǎn)是AVL樹(shù)中任何節(jié)點(diǎn)的兩個(gè)子樹(shù)的高度最大差別為1,本文主要給大家介紹了C++如何實(shí)現(xiàn)AVL樹(shù),需要的朋友可以參考下2022-08-08C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼
在C語(yǔ)言中,printf 函數(shù)可以直接實(shí)現(xiàn)部分進(jìn)制轉(zhuǎn)換功能,通過(guò)格式說(shuō)明符(format specifier)快速輸出不同進(jìn)制的數(shù)值,下面給大家分享C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼,感興趣的朋友一起看看吧2025-04-04