#include<stdio.h>
#include<windows.h>
#include<string.h>
#include <stdlib.h>
#include<assert.h>
- 方法一
分析:原字符串ABCD1234,若要旋轉4位,則將字符串分爲兩部分
先將字符串ABCD逆序得:DCBA;
然後將1234逆序得:4321;
得到現在字符串:DCBA4321,再逆序得1234ABCD,即原字符串的左旋k位。
void Reverse(char* left, char* right)
{
assert(left);
assert(right);
while (left < right)
{
*left ^= *right;
*right ^= *left;
*left ^= *right;
left++;
right--;
}
}
void LevoStrOne(char *str, int len , int k)
{
assert(str);
if (str != NULL && len > 0)
{
k = k%len;
Reverse(str + 0, str + k - 1);
Reverse(str + k, str + len - 1);
Reverse(str + 0, str + len - 1);
}
else
{
return;
}
}
- 方法二
分析:開闢一個新的字符串空間s,先將ABCD1234複製過去,然後再將ABCD1234拼接在s後面得到ABCD1234ABCD1234,要移動k位,在s字符串中從第k位開始取原字符串長度複製到原字符串str中,這個操作可以用strncpy完成。
void LevoStrTwo(char str[], int len, int k)
{
k %= len;
char *s = (char *)malloc((2 * len + 1)*sizeof(char));
if (s == NULL)
{
printf("mallic error\n");
}
strcpy(s,str);
strcat(s,str);
strncpy(str, s + k, len);
free(s);
}
- 方法三
分析:先將A字符給temp保存,ABCD1234中從B字符開始向左拷貝得到BBCD1234,然後依次拷貝得到BCD12344,再將temp給字符串最後一位得到BCD1234A。
void LevoStrThree(char *str,int len,int k)
{
k %= len;
int i = 0;
for (i=0; i < k; i++)
{
int j = 0;
char temp = str[j];
for (j=0; j < len - 1; j++)
{
str[j] = str[j + 1];
}
str[j] = temp;
}
}
void test()
{
char str[] = "ABCD1234";
char *ret = NULL;
int len = strlen(str);
printf("原字符串:%s\n",str);
LevoStrThree(str, len, 4);
printf("左旋後的字符串:%s\n", str);
}
int main()
{
test();
system("pause");
return 0;
}