前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现一个函数可以左旋字符串中的k个字符包学会!(两种办法)

实现一个函数可以左旋字符串中的k个字符包学会!(两种办法)

作者头像
ahao
发布2024-03-19 18:53:02
730
发布2024-03-19 18:53:02
举报
文章被收录于专栏:学习学习
题目描述

实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB

题目分析

我们将思路先捋清楚,做任何题目之前不要盲目直接地去敲代码,可以先在自己的草稿纸上画图理解,在之后的数据结构学习中更是要养成这个学习习惯,推荐大家可以去看一本数——《剑指offer》,这个习惯就在其中有提到。

方法一

方法一,我们可以将前k个字符先逆序,然后再将后面的字符逆序,再将整体逆序,就可以得出左旋k个字符后的字符串 例如,我们将字符串ABCDE左旋2个字符: 思路如下:

方法一代码实现

首先我们下一个交换函数 因为这里是逆序字符串,所以这里的a,b的类型是char*

代码语言:javascript
复制
void swap(char* a, char* b)
{
	char temp = *a;
	*a = *b;
	*b = temp;
}

然后我们写逆序函数 当left<right的时候才逆序,等于的时候不用逆序,记住,swap函数里面的参数我们是传址调用,所以要用取地址符号&取出其字符的地址 然后left是往右移动,即进行“++”操作 right则相反,进行“- -”操作

代码语言:javascript
复制
void reverse(char* src, int left,int right)
{

	while (left < right)
	{
		swap(&src[left], &src[right]);
		left++;
		right--;
	}
}

完整代码: 注意: 当k大于字符串的长度len是,就取它的余数,左旋也是一样的效果 还有需要注意的是左旋开始的下标问题: 逆序前半段应该下标应该是从0开始,k-1结尾 后半段则是k开始,len-1结尾 整体逆序就是0开始,len-1结尾

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
void swap(char* a, char* b)
{
	char temp = *a;
	*a = *b;
	*b = temp;
}
void reverse(char* src, int left,int right)
{

	while (left < right)
	{
		swap(&src[left], &src[right]);
		left++;
		right--;
	}
}
int main()
{
	int k = 0;
	scanf("%d", &k);
	char arr[] = "ABCDEF";
	int len = strlen(arr);
	if (k > len)
	{
		k %= len;
	}
	reverse(arr, 0, k - 1);
	reverse(arr, k, len - 1);
	reverse(arr, 0, len - 1);
	printf("%s", arr);
	return 0;
}

这样,我们就完成了字符串的左旋了

方法二

我们需要左旋k个字符,那我们是不是就可以创建一个新的空间,先将后面的len-k个字符放进这个新的空间,然后再将前面的k个字符放进去,就可以实现字符串的左旋了呢? 我们用图来了解一下: 我们用开辟一个动态的内存空间temp用来存放从arr拷贝出来的字符串 然后再将temp中的内容拷贝到arr里,就实现了字符串的左旋了

方法一代码实现

首先开辟temp 字符串有多长我们就开辟多大的空间,避免出现内存的浪费 因此我们最好选择动态内存开辟(关于动态内存详解大家可以看我之前的博客)

代码语言:javascript
复制
char* temp = (char*)malloc(sizeof(char) * len);

字符串的拷贝: 我们使用memcpy函数将其放入新的空间temp中,然后再用memcpy将temp中的字符串统一放入arr中 关于memcpy函数不懂的也可以看我之前的博客

代码语言:javascript
复制
memcpy(temp, arr + len - k, sizeof(char) *(len-k));
//后面len-k个字符是从下标为len-k-1开始的,此时temp是空的,所以起始地址就是temp
memcpy(temp + len-k, arr, sizeof(char) * k);
//将arr的前k个字符下标是0开始,就是arr,但是放入temp的地址是temp的下标为len-k的地方开始的
memcpy(arr, temp, sizeof(char) * len);

放入arr后记得释放内存,并且将其置为空指针,memcpy的头文件为stdlib.h 完整代码如下:

代码语言:javascript
复制
void reverse(char* arr, int len, int k)
{
	char* temp = (char*)malloc(sizeof(char) * len);
	memcpy(temp, arr + len - k - 1, sizeof(char) * (len - k));
	memcpy(temp + len - k, arr, sizeof(char) * k);
	memcpy(arr, temp, sizeof(char) * len);
	free(temp);
	temp = NULL;
}
int main()
{
	char arr[] = "ABCDE";
	int len = strlen(arr);
	int k = 0;
	if (k > len)
		k %= len;
	scanf("%d", &k);
	reverse(arr, len, k);
	printf("%s\n", arr);
	return 0;
}

方法二的左旋字符串就完成了

这里我给大家留下一个题目: 大家可以思考一下,下期为大家解答

代码语言:javascript
复制
判断一个字符串是否为另一个字符串左旋后的字符
是的话就返回1
不是返回0

今天的分享就到这了,谢谢大家的支持!下次见!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 题目分析
    • 方法一
      • 方法一代码实现
        • 方法二
          • 方法一代码实现
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档