【每日一题】实现一个函数,可以左旋字符串中的k个字符。
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
【代码实现】
法一:逐个搬移元素法
void Rotate1(char *arr,int k)//将要旋转的元素一个一个的旋转过去
{
assert(arr);
int sz = strlen(arr);
while (k--)
{
char temp = arr[0];//保存旋转元素
for (int i = 0; i < sz - 1;i++)//搬移元素
{
arr[i] = arr[i + 1];
}
arr[sz-1] = temp;//将保存的元素放置在最后
}
}
法二:三步旋转法:
void Reverse(char* left, char* right)//旋转函数
{
assert(left);
assert(right);
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
void Rotate2(char* arr, int k)
{
assert(arr);
int sz = strlen(arr);
Reverse(arr, arr + k-1);//先将要左旋的元素进行旋转
Reverse(arr+k, arr + sz-1);//再将剩下的元素进行旋转
Reverse(arr, arr + sz-1);//最后整体旋转
}
【测试代码】
int main()
{
char arr[] = "ABCDEFG";
Rotate2(arr,3);
printf("%s\n", arr);
system("pause");
return 0;
}
【运行结果】