C/C++左旋字符串實現(xiàn)代碼舉例
題目
實現(xiàn)一個函數(shù),可以左旋字符串中的k個字符。
例如:ABCD左旋一個字符得到BCDA ABCD左旋兩個字符得到CDAB。
設計循環(huán)使其可以旋1次,然后讓他執(zhí)行n次是一個最簡單的思路:
長度為5的情況下,旋轉6、11、16...次相當于1次,7、12、17...次相當于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;
}
}改進一:
一次一次轉比較麻煩,我們可以選擇拼接法,一次到位:
void leftRound(char * src, int time)
{
int len = strlen(src);
int pos = time % len; //斷開位置的下標
char tmp[256] = { 0 }; //更準確的話可以選擇malloc len + 1個字節(jié)的空間來做這個tmp
strcpy(tmp, src + pos); //先將后面的全部拷過來
strncat(tmp, src, pos); //然后將前面幾個接上
strcpy(src, tmp); //最后拷回去
}改進二:
這個方法要用到一個數(shù)組形成的輔助空間,讓人覺得有點不爽,還可以有更好的選擇,例如ABCDEFG,左旋3次后變成DEFGABC,有一個特殊的操作方式:
先將要左旋的前三個家伙逆序(CBADEFG),然后將后半段也逆序(CBAGFED),最后整體逆序(DEFGABC)即可。這樣只需要做數(shù)值交換即可,可以寫一個函數(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); //整體逆序
}補充:右旋字符串
總結
到此這篇關于C/C++左旋字符串實現(xiàn)的文章就介紹到這了,更多相關C/C++左旋字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言中的一維數(shù)組與二維數(shù)組的實現(xiàn)
數(shù)組可以幫我們巧妙解決生活中的問題,使我們的代碼簡潔,本文主要介紹了C語言中的一維數(shù)組與二維數(shù)組,具有一定的參考價值,感興趣的可以了解一下2023-12-12
C++11/14 線程中使用Lambda函數(shù)的方法
這篇文章主要介紹了C++11/14 線程中使用Lambda函數(shù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01
C語言之結構體定義 typedef struct 用法詳解和用法小結
這篇文章主要介紹了C語言的結構體定義typedef struct用法詳解和用法小結,typedef是類型定義,typedef struct 是為了使用這個結構體方便,感興趣的同學可以參考閱讀2023-03-03

