什么是左旋呢?
就是第一个字符放到最后一个字符呀!然后第二个字符和最后的字符依次往前挪。
举个例子就知道了
eq:char arr1[10] = "ABCDEF"// 1
char arr2[10] = "BCDEFA"// 2
这样就是说arr2是arr1左旋一次的值啦!
首先写好主体先哦
void string_rotate(char* arr, int k)
{
}
int main()
{
//实现字符串的向左旋转
int k = 2;//要向左旋转的次数
char arr[10] = "ABCDEF";//要旋转的字符串string_left_rotate(arr , k);//多么霸气的函数名
printf("旋转后的字符串:%s\n", arr);//打印旋转后的字符串
return 0;
}
那这个自定义函数该怎么写呢?
首先咱们要学会把问题转换为图,反正我不转化为图,我是理解不了的
然后我把所有代码放在下面
void string_left_rotate(char* arr, int k)
{
assert(arr);//不允许传空指针
int len = strlen(arr);//计算字符串的长度
char temp = 0;
int i = 0;
int j = 0;
for (i = 0; i < k; i++)
{
temp = *arr;//首个元素赋值给tempfor (j = 0; j < len - 1; j++)
{
*(arr + j )= *(arr + 1 + j);//总共把len-1的元素往前挪移
}
*(arr + len - 1) = temp;//把首个元素放到最后
}
}
里面如果有哪个库函数不懂的或者头文件不知道的可以去www.cplusplus.com找哦
那写完这个代码之后,可以运行,我们的任务就结束了么?
当然不,我们还要想其他的办法,是不是还要其他的办法,所以下面我再写一个办法
名字叫做三步反转法 牛吧!
那三步反转法怎么搞呢,那么我继续画图来给你们解释
同样的先写出代码主体
void reverse(char* left, char *right)
{
}
void string_left_rotate(char* arr, int k)
{
}
int main()
{
//三步反转法
int k = 4;//要向左旋转的个数char arr[10] = "ABCDEF";
string_left_rotate(arr, k);
printf("旋转后的字符串:%s\n", arr);
return 0;
}
代码如下
void reverse( char* left, char *right)
{
assert(left);//不允许传空值
assert(right);//不允许传空值
while (left < right)//left与right这里是指地址
{
char temp = *left;//解引用后就是所对应地址的字符
//所以没有解引用的指针看作为地址,解引用后的指针看作为值
*left = *right;
*right = temp;
left++;
right--;//实现在规定的范围(left和right之间)的交换
}
}
void string_left_rotate(char* arr, int k)
{
assert(arr);//不允许传空值int len = strlen(arr);//字符串总长度
reverse(arr, arr + k - 1);//反转前k个
reverse(arr + k, arr + len - 1);//反转后len - k个
reverse(arr, arr + len - 1);//整体反转
}
总结:这个左旋让我感觉很像数据结构的顺序表插入,不过我还是用来理解指针的使用,指针很重要,也不好学,我感觉还是得多刷题,在题中理解知识点,并且希望大佬来指正下,看有没有需要改进的地方,还有这个左旋的问题还有很多解法,不单单这一种解法,在一本叫做《程序编程艺术》中就有全部的解法,但他的方法就是所有的方法了么?还需要你去探索哦!