C語(yǔ)言左旋字符串的三種實(shí)現(xiàn)方式
題目:
實(shí)現(xiàn)一個(gè)函數(shù),可以左旋字符串中的k個(gè)字符。
例如:
ABCD左旋一個(gè)字符得到BCDA
ABCD左旋兩個(gè)字符得到CDAB
方法一:
我們畫個(gè)圖分析一下:
基本邏輯:
就是我們每一次旋轉(zhuǎn)之前,我們就取出 arr 數(shù)組的首元素存放在 tmp 中,然后將 arr 數(shù)組剩余的每一個(gè)元素都往前移動(dòng)一位,最后我們?cè)侔?tmp 中的元素放回 arr 數(shù)組末尾的位置。
實(shí)現(xiàn)算法:
我們發(fā)現(xiàn),abcd 4個(gè)字符旋轉(zhuǎn) k = 4 個(gè)字符時(shí),數(shù)組就回到了本身數(shù)組 abcd 。這時(shí),我們可以這樣理解,雖然我們旋轉(zhuǎn)了4個(gè)字符,但我們實(shí)際上我們旋轉(zhuǎn)了0個(gè)字符;依次類推,旋轉(zhuǎn)5個(gè)字符,實(shí)際上旋轉(zhuǎn)了1個(gè)字符;接下去也是如此......接下來(lái),我們?cè)侔炎址L(zhǎng)度加長(zhǎng),變成abcde 5個(gè)字符,旋轉(zhuǎn) k = 5 個(gè)字符時(shí),數(shù)組就回到了本身數(shù)組 abcde,后面的分析就跟4個(gè)字符分析是一樣的。然后,我們能夠得到這樣一個(gè)表達(dá)式 num(實(shí)際次數(shù)) = k % len(數(shù)組字符個(gè)數(shù))。
代碼實(shí)現(xiàn):
#include <stdio.h> #include <string.h> void Turn_left(char arr[],int k) { int len = strlen(arr); //求得真實(shí)的旋轉(zhuǎn)次數(shù) int num = k % len; for (int i = 0; i < num; i++) { //每次移動(dòng)一個(gè) char tmp = arr[0]; int j = 0; for (j = 0; j < len - 1; j++) { //移動(dòng)數(shù)據(jù) arr[j] = arr[j + 1]; } arr[j] = tmp; } } int main() { char arr[] = "abcd"; int k = 0; scanf("%d", &k);//輸入旋轉(zhuǎn)字符個(gè)數(shù) Turn_left(arr, k); printf("%s\n", arr); return 0; }
運(yùn)行結(jié)果:
方法二:
我們也可以畫個(gè)圖分析一下:
這里我們要用到兩個(gè)函數(shù):
strcpy() //字符串拷貝 strcpy(str1,str2)//將str2的元素拷貝到str2中 strncat()//這也是字符串拷貝 strncat(tmp,arr,k)//把a(bǔ)rr開(kāi)始的元素 拷貝到tmp這個(gè)字符串的后面,拷貝k個(gè)
代碼實(shí)現(xiàn):
#include <stdio.h> #include <string.h> void Turn_left(char arr[], int k) { int len = strlen(arr); int num = k % len; char tmp[1000] = { 0 }; //從arr + num的位置 開(kāi)始拷貝字符串到tmp里面 strcpy(tmp, arr + num); //把a(bǔ)rr開(kāi)始的元素 拷貝到tmp這個(gè)字符串的后面,拷貝num個(gè) strncat(tmp, arr, num); //最后將tmp整個(gè)數(shù)組元素復(fù)制到arr數(shù)組中 strcpy(arr, tmp); } int main() { char arr[] = "abcd"; int k = 0; scanf("%d", &k);//輸入旋轉(zhuǎn)字符個(gè)數(shù) Turn_left(arr, k);//2 printf("%s\n", arr); return 0; }
運(yùn)行結(jié)果:
方法三:
最后一種方式我們也畫圖分析一下:
代碼實(shí)現(xiàn):
#include <stdio.h> void Reverse(char arr[], int i, int j) { while (i < j) { char tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } } void Turn_left(char arr[], int k) { int len = strlen(arr); int num = k % len; //將num位置前面的元素逆序 Reverse(arr, 0, num - 1); //將num位置以及之后的元素逆序 Reverse(arr, num, len - 1); //整個(gè)數(shù)組逆序 Reverse(arr, 0, len - 1); } int main() { char arr[] = "abcd"; int k = 0; scanf("%d", &k);//輸入旋轉(zhuǎn)字符個(gè)數(shù) Turn_left(arr, k);//2 printf("%s\n", arr); return 0; }
運(yùn)行結(jié)果:
以上就是C語(yǔ)言左旋字符串的三種實(shí)現(xiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言左旋字符串的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)貪吃蛇游戲設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07