【初阶数据结构与算法 3】时间/空间复杂度练习——左旋字符


前言

前面学习了时间复杂度和空间复杂度相关的知识点,本文将通过练习题左旋字符,来巩固所学知识。


1、左旋字符

实现一个函数,可以左旋字符串中的k个字符,例如:

  • ABCD 左旋一个字符,将字符 A 放到字符串末尾,得到 BCDA
  • ABCD 左旋两个字符,将字符 A B放到字符串末尾,得到 CDAB

在这里插入图片描述

通过题目思路分析可以发现,左旋字符和前面所学【初阶数据结构与算法 2】时间/空间复杂度练习——转轮数组 存在一些异同点:

  • 左旋字符和轮转数组实现原理雷同
  • 两者只是方向不同,一个向右,一个向左
  • 左旋字符的时间复杂度、空间复杂度计算与轮转数组的复杂度计算相同

2、方法1——数组

在这里插入图片描述

//基础解法1  用数组
void leftChange1(char a[],int cnt)
{
	int tmp = 0;
	int len = strlen(a);//4
	cnt = cnt % len;//表示旋转几个字符
	for (int k = 0; k < cnt; k++)
	{
		tmp = a[0];
		for (int i = 0; i < len; i++)
		{
			a[i] = a[i + 1];
		}
		a[len - 1] = tmp;
	}	
}

3、方法2——指针

方法2和方法1没有区别

//基础解法2  用指针
void leftChange2(char* a, int cnt)
{
	int tmp = 0;
	int len = strlen(a);//4
	cnt = cnt % len;//表示旋转几个字符

	for (int k = 0; k < cnt; k++)
	{
		tmp = *a;
		for (int i = 0; i < len; i++)
		{
			*(a + i) = *(a + i + 1);
		}
		*(a + len-1)= tmp;
	}
}

4、方法3——动态内存空间

在这里插入图片描述

//解法3  用指针、字符串库函数、动态内存空间

//方法2 分两半直接copy,最后在合并一起copy回去
void leftChange3(char* a, int cnt)
{
	int len = strlen(a);
	cnt = cnt % len;
	char* pc = (char*)malloc(len + 1);
	if (pc == NULL)
	{
		perror("malloc:");
		return;
	}
	strcpy(pc, a + cnt);//字符串库函数
	strncat(pc, a ,cnt);
	strcpy(a, pc);
	free(pc);
	pc = NULL;
}

5、方法4——3次逆转

在这里插入图片描述

//方法4 3次逆转,很难想到 
void reverse(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void leftChange4(char* a, int cnt)
{
	int len = strlen(a);
	cnt = cnt % len;
	reverse(a, a + cnt - 1);
	reverse(a + cnt, a + len - 1);
	reverse(a, a + len - 1);
}
int main()
{
	char a[] = "abcd";
	//leftChange1(a, 2);
	//leftChange2(a, 2);
	//leftChange3(a, 2);
	leftChange4(a, 2);
	printf("%s\n", a);
	return 0;
}

总结

时间复杂度和空间复杂度要牢记定义,多练习才能熟练掌握。

要做到不写代码,只分析思路就能知道时间复杂度的阶数。

初阶数据结构和算法建立在C语言之上的,学习这部分内容,要随时复习之前所学的知识。

下一篇将继续练习。

  • 48
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 51
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 51
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初学C语言者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值