实现一个函数,可以左旋字符串中的k个字符
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
方法一
暴力求解法
#include <stdio.h>
#include <string.h>
#include <assert.h>
void left_move(char* arr, int k)
{
assert(arr != NULL);//断言,判断arr是否为空指针
int i = 0;
int len = strlen(arr);//计算的是字符串arr的长度
for (i = 0; i < k; i++)
{ //先左旋转一个字符
char tmp = *arr; //1.把tmp赋值arr左边第一个字符
int j = 0;
for (j = 0; j < len - 1; j++) //2.将后面字符依次向前移
{
*(arr + j) = *(arr + j + 1);
}
*(arr + len - 1) = tmp; //3.将最后一个的字符赋值tmp(就是第一个字符)
}
}
int main()
{
char arr[] = "abcdef";
left_move(arr, 2);
printf("%s\n", arr);
return 0;
}
方法二
三步翻转法
ab cde 左旋2位
ba 逆序左边
edc 逆序右边
edc ba 逆序整体
#include <stdio.h>
#include <assert.h>
#include <string.h>
void reverse(char* left, char* right) //通过地址来逆序
{
assert(left != NULL); //传过来的字符不能为空
assert(right != NULL);
while (left < right) //逆序终止条件
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move(char* arr, int k)
{
assert(arr != NULL); //断言,判断arr是否为空指针
int len = strlen(arr); //计算的是字符串arr的长度
assert(k <= len); //左旋个数不得超过字符串长度
reverse(arr, arr + k - 1); //逆序左边
reverse(arr + k, arr + len - 1); //逆序右边
reverse(arr, arr + len - 1); //逆序整体
}
int main()
{
char arr[] = "abcdef";
left_move(arr, 2);
printf("%s\n", arr);
return 0;
}