题目介绍
实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
方法一
采用循环移位,对需要旋转的k个字符按顺序进行旋转,先将要旋转的一个字符保存起来,将后面的往前挪动一位,再将保存起来的这个字符赋给最后一位,这样连续循环k次。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void left_remove(char* p, int n, int len)
{
int i = 0;
for (i = 0; i < n; i++)
{
int j = 0;
int tmp = p[0];
for (j = 0; j < len - 1; j++)
{
p[j] = p[j + 1];
}
p[len - 1] = tmp;
}
}
int main()
{
char p[] = "ABCD";
int n = 0;
int len = strlen(p);
printf("左旋前字符串为:>");
printf("%s\n", p);
printf("左旋几位:>");
scanf_s("%d", &n);
while (n<1 || n>len - 1)
{
if (n == len || n == 0)
{
printf("左旋后字符串为:>");
printf("%s", p);
return 0;
}
else
{
printf("输入有误!\n");
scanf_s("%d", &n);
}
}
left_remove(p, n, len);
printf("旋转后:%s\n", p);
system("pause");
return 0;
}
方法二
俗称三步旋转法:
先将要左旋的字符进行旋转,再将未左旋的字符进行旋转,最后所有字符进行旋转,即得到所需字符。比如 ABCD 要将 AB 字符旋转 得到的应该是:CDAB 按照上面所说的即为 BACD->BADC->CDAB不难看出来所得是一样的。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reserve(char* left,char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_remove(char* p, int n, int len)
{
reserve(p, p + n - 1);
reserve(p + n, p + len - 1);
reserve(p, p + len - 1);
}
int main()
{
char p[] = "ABCD";
int n = 0;
int len = strlen(p);
printf("左旋前字符串为:>");
printf("%s\n", p);
printf("左旋几位:>");
scanf_s("%d", &n);
while (n<1 || n>len - 1)
{
if (n == len || n == 0)
{
printf("左旋后字符串为:>");
printf("%s", p);
return 0;
}
else
{
printf("输入有误!\n");
scanf_s("%d", &n);
}
}
left_remove(p, n, len);
printf("旋转后:%s\n", p);
system("pause");
return 0;
}
方法三
指针实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void left_remove(char arr[], int n)
{
char arr1[5] = { 0 };
char* mov1 = arr;
char* mov2 = arr;
char* res1 = arr1;
char* res2 = arr1;
while (n--)
{
*res1++ = *mov2++;
}
while (*mov2)
{
*mov1++ = *mov2++;
}
while (*mov1)
{
*mov1++ = *res2++;
}
}
int main()
{
char p[] = "ABCD";
int n = 0;
int len = strlen(p);
printf("左旋前字符串为:>");
printf("%s\n", p);
printf("左旋几位:>");
scanf_s("%d", &n);
while (n<1 || n>len - 1)
{
if (n == len || n == 0)
{
printf("左旋后字符串为:>");
printf("%s", p);
return 0;
}
else
{
printf("输入有误!\n");
scanf_s("%d", &n);
}
}
left_remove(p, n);
printf("旋转后:%s\n", p);
system("pause");
return 0;
}