实现字符串左旋--移首补尾法

在这里插入图片描述
先介绍一种方法,等笔者研究完别的方法再更新

移首补尾

实现思路:每次都把新字符串的第一位移到最后一位
在这里插入图片描述

#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,刚好访问的是数组中最后一个元素

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值