目录
暴力求解
优雅求解
左旋字符串,实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
暴力求解
每左旋转1个字符串,旋转k次,这种方法效率比较低,因为在多次旋转过程中,某几个字符要多次移动。
#include <stdio.h>
#include <string.h>
#include <assert.h>
void left_move(char* str, int k)
{
assert(str);
int j = 0;
for (j = 0; j < k; j++)
{
char tmp = *str;
int len = strlen(str);
int i = 0;
for (i = 0; i < len - 1; i++)
{
str[i] = str[i + 1];
}
str[i] = tmp;
}
}
int main()
{
char arr[] = "abcdef";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
优雅求解
把整个字符串从待旋转的位置后边分开,分为左侧和右侧,经过这几个过程:1.逆序左侧 2.逆序右侧 3.逆序整个字符串。经过三次旋转,得到想要的左旋效果。文章来源:https://www.toymoban.com/news/detail-688117.html
#include <stdio.h>
#include <string.h>
#include <assert.h>
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* str, int k)
{
assert(str);
int len = strlen(str);
k %= len;
//左边逆序
reverse(str, str + k - 1);
//右边逆序
reverse(str + k, str + len - 1);
//整体逆序
reverse(str, str + len - 1);
}
int main()
{
char arr[] = "abcdef";
int k = 0;
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
文章来源地址https://www.toymoban.com/news/detail-688117.html
到了这里,关于C语言左旋字符串详解(付完整代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!