例如:ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
1.我们先计算出有效的左旋次数,然后进行将第一个数拿出来,后边一次前移,再将第一个放到最后一个,循环有效次数就可以了。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void left_remove(char *arr, int n)
{
assert(arr);
assert(n > 0);
int len = strlen(arr);
n %=len;
int i = 0;
for (; i < n; i++)
{
char first = arr[0];
int j = 0;
for (; j < len - 1; j++)
{
arr[j] = arr[j + 1];
}
arr[j] = first;
}
}
int main()
{
char arr[] = "ABCD";
int n = 23;
left_remove(arr, n);
printf("现在的字符:%s\n", arr);
system("pause");
return 0;
}
2.三步左旋法
void reverse(char *left, char *right)
{
while (left < right)
{
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_remove(char *arr, int n)
{
assert(arr);
assert(n > 0);
int len = strlen(arr);
n %=len;
reverse(arr, arr + n - 1);
reverse(arr + n, arr + len-1);
reverse(arr, arr + len-1);
}
int main()
{
char arr[] = "ABCD";
int n = 23;
left_remove(arr, n);
printf("现在的字符:%s\n", arr);
system("pause");
return 0;
}
3.双倍串
void left_remove(char *arr, int n)
{
assert(arr);
assert(n > 0);
int len = strlen(arr);
n %= len;
char *buf= (char *)malloc(2 * len + 1);
if (!buf)
{
return;
}
strcpy(buf, arr);
strcat(buf, arr);
strncpy(arr, buf + n, len);
free(buf);
}
int main()
{
char arr[] = "ABCD";
int n = 23;
left_remove(arr, n);
printf("现在的字符:%s\n", arr);
system("pause");
return 0;
}