之前看到过一个很有意思的一个题目,和大家分享一下。
题目是这样的,实现一个函数,要求是左旋字符串的k个字符
这里我想到了两种简单的方法
第一种方法是每次旋转一个字符,把这个动作执行k次
首先创建一个字符串(随机)为 char arr[]="abcdefghi";
这里先以k=1为例;
上图
完整代码如下:
void left_move(char arr[], int k)
{
//每一次只旋转一个字符,把这个动作执行K次
int i = 0;
int len = strlen(arr);
k %= len;
for (i = 0; i < k; i++)
{
//1
char tmp = arr[0];
//2 把后边的字符全部往前挪动一个位置
int j = 0;
for (j = 0; j < len - 1; j++)
{
arr[j] = arr[j + 1];
}
//3
arr[len - 1] = tmp;
}
}
int main()
{
char arr[] = "abcdefghi";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
这里的k%=len;是怕给定的k值太大
第二种方法是散步翻转法
上图
完整代码如下:
void reverse(char*left, char*right)
{
assert(left && right); //防止指针为空
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
void left_move(char arr[], int k)
{
//每一次只旋转一个字符,把这个动作执行K次
int i = 0;
int len = strlen(arr);
k %= len;
reverse(arr, arr+k-1);
reverse(arr+k, arr + len - 1);
reverse(arr, arr + len - 1);
}
int main()
{
char arr[] = "abcdefghi";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
这个如果看不懂,可以结合图看一下。