C语言:字符串左旋
问题
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
方法一:将第一个字符复制一份,然后将字符串左移一位再将第一个字符赋值给最后一位,要移动k个字符就循环k次。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
#include<windows.h>
#include <stdlib.h>
void left_copy(char *str, int len, int k)
{
k = k%len;//避免重复的移动
int i = 0;
for (i = 0; i < k; i++)
{
char copy = str[0];
int j = 0;
for (j = 0; j < len-1; j++)
{
str[j] = str[j + 1];
}
str[j] = copy;
}
}
int main()
{
char c[] = "ABCD";
int k = 2;
int len = strlen(c);
printf("左旋前:%s\n", c);
left_copy(c, len, k);
printf("左旋后:%s\n", c);
system("pause");
return 0;
}
方法二:将字符串分为两部分,先将前K个字符逆置,再将后一部分字符串逆置,最后将整个字符串逆置。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
#include<windows.h>
#include <stdlib.h>
void Reverse(char *start,char *end)
{
while (start < end)
{
*start ^= *end;
*end ^= *start;
*start ^= *end;
start++;
end--;
}
}
void left_inversion(char c[], int len , int k)
{
k = k%len;
Reverse(c, c+k-1);
Reverse(c+k, c+len-1);
Reverse(c, c+len-1);
}
int main()
{
char c[] = "ABCD";
int k = 2;
int len = strlen(c);
printf("左旋前:%s\n", c);
left_inversion(c, len, k);
printf("左旋后:%s\n", c);
system("pause");
return 0;
}
方法三:开辟一个2*len+1的空间,然后将字符串后面连一个相同的字符串,然后需要左移几位,就偏移几次,然后取之后的len个元素拿出来赋给字符串c
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
#include<windows.h>
#include <stdlib.h>
void left_malloc(char c[], int len , int k)
{
k = k % len;
char *p = (char *)malloc((2 * len + 1) * sizeof(char));
strcpy(p, c);
strcat(p, c);
strncpy(c, p + k, len);
free(p);
}
int main()
{
char c[] = "ABCD";
int k = 2;
int len = strlen(c);
printf("左旋前:%s\n", c);
left_malloc(c, len, k);
printf("左旋后:%s\n", c);
system("pause");
return 0;
}