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

简介: 实现一个函数可以左旋字符串中的k个字符包学会!(两种办法)
题目描述

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

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

题目分析

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

方法一

方法一,我们可以将前k个字符先逆序,然后再将后面的字符逆序,再将整体逆序,就可以得出左旋k个字符后的字符串

例如,我们将字符串ABCDE左旋2个字符:

思路如下:

方法一代码实现

首先我们下一个交换函数

因为这里是逆序字符串,所以这里的a,b的类型是char*

void swap(char* a, char* b)
{
  char temp = *a;
  *a = *b;
  *b = temp;
}

然后我们写逆序函数

当left<right的时候才逆序,等于的时候不用逆序,记住,swap函数里面的参数我们是传址调用,所以要用取地址符号&取出其字符的地址

然后left是往右移动,即进行“++”操作

right则相反,进行“- -”操作

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结尾

#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

字符串有多长我们就开辟多大的空间,避免出现内存的浪费

因此我们最好选择动态内存开辟(关于动态内存详解大家可以看我之前的博客)

char* temp = (char*)malloc(sizeof(char) * len);

字符串的拷贝:

我们使用memcpy函数将其放入新的空间temp中,然后再用memcpy将temp中的字符串统一放入arr中

关于memcpy函数不懂的也可以看我之前的博客

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

完整代码如下:

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;
}

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

这里我给大家留下一个题目:

大家可以思考一下,下期为大家解答

判断一个字符串是否为另一个字符串左旋后的字符
是的话就返回1
不是返回0

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

相关文章
|
关系型数据库 PostgreSQL
postgresql查看服务与启动
服务启动,状态查看等等
2669 0
|
2月前
|
网络协议 安全 网络安全
AiWCLOUD:免备案CDN,高防CDN,不限内容,过移动屏蔽在跨境业务加速防护下
本文深度解析免备案高防CDN技术:依托境外节点规避ICP备案,实现“即开即用”;融合全球加速、T级分布式清洗与智能调度,一站式解决跨境延迟、链路不稳定及DDoS/CC攻击难题,适用于游戏出海、跨境电商、海外媒体等场景。(239字)
463 2
|
存储 安全 网络协议
使用 firewall-cmd 管理 Linux 防火墙端口
本文将介绍如何使用 firewall-cmd 工具在 Linux 系统中进行简单端口管理,包括开放、查询、关闭等操作。通过实例展示相关命令的用法,希望能对大家有所帮助。
1778 0
|
10月前
|
存储 弹性计算 安全
阿里云服务器ECS实例、镜像、云盘等基本概念,以及与其他云服务的关系介绍
阿里云服务器ECS是弹性计算服务,涵盖ECS实例、镜像、云盘等核心概念及包年包月、按量付费等计费模式。其与专有网络VPC、弹性公网IP、云数据库RDS、对象存储OSS、负载均衡SLB及云安全中心紧密协同,构建安全高效的云上解决方案。ECS支持弹性伸缩,具备高可靠性、易用性和安全性,适用于网站部署、数据处理、图形渲染、开发测试等场景,通过灵活配置和成本优化,满足个人开发者到企业级用户的多样化需求,是云计算领域的核心基础设施。
695 0
|
存储 算法 数据处理
从零搭建向量数据库:实现文本语义检索实战
本文带你从零实现一个最小可用的文本语义检索系统,剖析向量数据库核心模块:文本嵌入、向量存储、近似最近邻搜索、元数据过滤等。不追求极致性能,重在理解工程设计权衡。通过亲手搭建,掌握系统瓶颈与优化方向,真正用好成熟方案。
|
11月前
|
人工智能 运维 安全
6.8K星标背后的硬核实力:9组关键数据告诉你,为什么企业选择开源AI知识库做知识管理
在数字化转型深水区,开源AI知识库凭硬核数据突围:GitHub星标超6.8K,文档创作效率提升75%,检索精准度达94%,部署仅需3分28秒,成本直降67%。支持私有化部署、细粒度权限管控,适配金融、政务等高安全场景,助力企业实现知识高效激活与降本增效,成为2025年知识管理领域黑马。
486 2
|
11月前
|
XML Java 数据库连接
引入MybatisPlus的起步依赖
MyBatisPlus官方提供了一站式Starter,集成MyBatis与MyBatisPlus全部功能,支持自动装配,可直接替代原生MyBatis依赖。引入`mybatis-plus-boot-starter`后,无需额外配置,简化开发流程,原MyBatis依赖可移除,提升效率。
|
jenkins Java Shell
解决jenkins结束后kill掉衍生进程
解决jenkins结束后kill掉衍生进程
1186 4
|
存储 自然语言处理 监控
FunAudioLLM大模型SenseVoice和CosyVoice测评
FunAudioLLM大模型SenseVoice和CosyVoice测评
|
Java jenkins 持续交付
Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包
Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包
910 0
Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包