先介绍一种方法,等笔者研究完别的方法再更新
移首补尾
实现思路:每次都把新字符串的第一位移到最后一位
#include<stdio.h>
#include<string.h>
//可以直接把 char arr[] = "ABCDEF";放这里
//创建一个全局变量更好
void Switch(char* arr, int num, int len)
{
num = num % len;
int i = 0;
char temp =arr[0];
while (num)
{
temp = arr[0];
for (i = 0;i < len - 1;i++)
{
arr[i] = arr[i + 1];
}
arr[i] = temp;//还原首值
num--;//左旋次数
}
}
int main()
{
char arr[] = "ABCDEF";
size_t len = strlen(arr);
int num = 0;
while (scanf("%d", &num) != EOF)
{
char arr[] = "ABCDEF";
printf("%s\n", arr);
Switch(arr, num, len);
printf("%s\n", arr);
}
}
易迷糊的细节:
一.避免重复
假如 len=4 ,那么循环 4 次又重新回到 “ABCD" ,周期等于 4
所以,如果 num>4 ,num除以它的周期就是它循环的有效次数
num%len 可以避免几个周期的重复
二.关于temp变量:
(红框里的 1.和 2. 先解释2.)
理解这个变量,本质是理解这个函数的运行流程
元素的前后互换是无法真正实现的,而是后一个元素的值不断赋给前一个元素
因此赋值到最后,最后两个元素将都会是 “D”
必须把第一个元素先保存到 temp 变量里,等到第一趟循环完再把 temp里储存的值放到最后一个元素里
如下图所示:
(解释框框1.)
这里的两层循环,第一层大循环取决于num(左旋次数),每一趟要后置一个元素 ; 第二层循环是把元素提前
所以每一趟的首元素都不一样,每一趟开始必须初始化 temp
三.关于第二层循环 i 的范围以及终值
这里 i = len-2循环完后,先+1 再判断是否小于 len-1,顺序不能想乱
所以 i 最终的值是 len-1,刚好访问的是数组中最后一个元素