C語言左旋字符串的三種實現(xiàn)方式
題目:
實現(xiàn)一個函數(shù),可以左旋字符串中的k個字符。
例如:
ABCD左旋一個字符得到BCDA
ABCD左旋兩個字符得到CDAB
方法一:
我們畫個圖分析一下:

基本邏輯:
就是我們每一次旋轉(zhuǎn)之前,我們就取出 arr 數(shù)組的首元素存放在 tmp 中,然后將 arr 數(shù)組剩余的每一個元素都往前移動一位,最后我們再把 tmp 中的元素放回 arr 數(shù)組末尾的位置。
實現(xiàn)算法:
我們發(fā)現(xiàn),abcd 4個字符旋轉(zhuǎn) k = 4 個字符時,數(shù)組就回到了本身數(shù)組 abcd 。這時,我們可以這樣理解,雖然我們旋轉(zhuǎn)了4個字符,但我們實際上我們旋轉(zhuǎn)了0個字符;依次類推,旋轉(zhuǎn)5個字符,實際上旋轉(zhuǎn)了1個字符;接下去也是如此......接下來,我們再把字符長度加長,變成abcde 5個字符,旋轉(zhuǎn) k = 5 個字符時,數(shù)組就回到了本身數(shù)組 abcde,后面的分析就跟4個字符分析是一樣的。然后,我們能夠得到這樣一個表達(dá)式 num(實際次數(shù)) = k % len(數(shù)組字符個數(shù))。
代碼實現(xiàn):
#include <stdio.h>
#include <string.h>
void Turn_left(char arr[],int k)
{
int len = strlen(arr);
//求得真實的旋轉(zhuǎn)次數(shù)
int num = k % len;
for (int i = 0; i < num; i++)
{
//每次移動一個
char tmp = arr[0];
int j = 0;
for (j = 0; j < len - 1; j++)
{
//移動數(shù)據(jù)
arr[j] = arr[j + 1];
}
arr[j] = tmp;
}
}
int main()
{
char arr[] = "abcd";
int k = 0;
scanf("%d", &k);//輸入旋轉(zhuǎn)字符個數(shù)
Turn_left(arr, k);
printf("%s\n", arr);
return 0;
}運行結(jié)果:

方法二:
我們也可以畫個圖分析一下:

這里我們要用到兩個函數(shù):
strcpy() //字符串拷貝 strcpy(str1,str2)//將str2的元素拷貝到str2中 strncat()//這也是字符串拷貝 strncat(tmp,arr,k)//把a(bǔ)rr開始的元素 拷貝到tmp這個字符串的后面,拷貝k個
代碼實現(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的位置 開始拷貝字符串到tmp里面
strcpy(tmp, arr + num);
//把a(bǔ)rr開始的元素 拷貝到tmp這個字符串的后面,拷貝num個
strncat(tmp, arr, num);
//最后將tmp整個數(shù)組元素復(fù)制到arr數(shù)組中
strcpy(arr, tmp);
}
int main()
{
char arr[] = "abcd";
int k = 0;
scanf("%d", &k);//輸入旋轉(zhuǎn)字符個數(shù)
Turn_left(arr, k);//2
printf("%s\n", arr);
return 0;
}運行結(jié)果:

方法三:
最后一種方式我們也畫圖分析一下:

代碼實現(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);
//整個數(shù)組逆序
Reverse(arr, 0, len - 1);
}
int main()
{
char arr[] = "abcd";
int k = 0;
scanf("%d", &k);//輸入旋轉(zhuǎn)字符個數(shù)
Turn_left(arr, k);//2
printf("%s\n", arr);
return 0;
}運行結(jié)果:

以上就是C語言左旋字符串的三種實現(xiàn)方式的詳細(xì)內(nèi)容,更多關(guān)于C語言左旋字符串的資料請關(guān)注腳本之家其它相關(guān)文章!

