【C语言】字符串左旋的三种解题方法详细分析


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C语言

文章目录

  • 💯前言
  • 💯题目描述
  • 💯方法一:逐字符移动法
  • 💯方法二:使用辅助空间法
  • 💯方法三:三次反转法
  • 💯方法对比与总结
    • 拓展思考
  • 💯总结

在这里插入图片描述


在这里插入图片描述


💯前言

  • 在这篇文章中,我们将深入探讨字符串左旋的三种解决方案,系统分析每种方法的算法设计时间复杂度空间复杂度,以及其适用场景局限性。这些方法从简单到高效,分别展示了逐字符移动法使用辅助空间法三次反转法的不同特点及其理论基础
    通过对这些方法的详细对比讨论,读者将对字符串操作基本原理有更为深入的理解,掌握在不同应用场景下如何选择最优的解决方案,以提升代码的效率鲁棒性
    C语言
    在这里插入图片描述

💯题目描述

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

例如:

  • 给定字符串 ABCD,如果左旋 1 个字符,得到 BCDA
  • 如果左旋 2 个字符,得到 CDAB

左旋是指将字符串的前面部分字符移到字符串的末尾。我们将使用三种不同的实现方式来解决这一问题:逐字符移动法、使用辅助空间法、以及三次反转法。


💯方法一:逐字符移动法

思路

逐字符移动法是一种直观的实现方式,通过多次迭代将字符串的第一个字符移动到末尾,直到完成所需的旋转次数。该方法依赖于不断移动字符的位置以达到最终目标。其本质是一种线性搬移操作,容易理解,但在大数据量的情况下效率较低。
在这里插入图片描述

代码实现

void leftRound(char* str, int k) {int len = strlen(str);int time = k % len;for (int i = 0; i < time; i++) {char tmp = str[0];int j = 0;for (; j < len - 1; j++) {str[j] = str[j + 1];}str[j] = tmp;}
}int main() {char str[] = "abcdef";leftRound(str, 7);printf("%s\n", str);return 0;
}

解释

  • 获取字符串长度 len
  • 计算实际旋转次数 time = k % len,这样可以避免 k 超过字符串长度导致的冗余操作。
  • 外层循环用于执行 time 次旋转,每次只移动一个字符。
  • 使用内部的 for 循环,将每个字符依次前移一个位置,最后将原来的第一个字符移到末尾。

时间复杂度和空间复杂度

  • 时间复杂度:O(k * len),对于每次旋转都需要遍历整个字符串,因而效率较低。
  • 空间复杂度:O(1),只需一个额外的字符变量来暂存被移动的字符。

优缺点

  • 这种方法的优点是实现简单且易于理解,适合初学者用于理解字符串旋转的基本概念。但其缺点在于效率较低,尤其在 k 较大和字符串长度较长时,由于需要多次逐字符移动,时间开销会显著增加。

💯方法二:使用辅助空间法

思路

使用辅助空间法通过将旋转后的字符串临时保存,再将结果复制回原字符串。借助辅助空间将两个部分拼接,可以有效避免逐字符移动带来的低效问题。该方法的核心在于利用辅助数组,快速完成字符串的局部重组与合并
在这里插入图片描述

代码实现

void leftRound(char* str, int k) {int len = strlen(str);int time = k % len;char tmp[256] = { 0 };strcpy(tmp, str + time); strncat(tmp, str, time); strcpy(str, tmp);
}int main() {char str[] = "abcdef";leftRound(str, 7);printf("%s\n", str);return 0;
}

解释

  • 通过 strlen 获取字符串的长度。
  • 计算实际的旋转次数 time = k % len,以应对 k 过大时的情况。
  • 使用临时数组 tmp 存储旋转后的结果。
  • 利用 strcpy 函数将原字符串从 time 索引位置开始的部分复制到 tmp 中。
    • strcpy(tmp, str + time)str + time 表示指向原字符串从第 time 个位置开始的指针,strcpy 函数将从这个位置开始的所有字符(直到字符串结束符 )复制到 tmp 中。因此,tmp 中最初会存储字符串的后半部分。例如,若 str = "ABCD"time = 2strcpy(tmp, str + time)"CD" 复制到 tmp,结果为 tmp = "CD"
  • 使用 strncat 函数将原字符串的前 time 个字符拼接到 tmp 的末尾。
    • strncat(tmp, str, time)strncat 用于将源字符串的指定数量字符拼接到目标字符串的末尾。在这里,str 表示原字符串,time 表示从 str 开头开始的 time 个字符。因此,strncat(tmp, str, time) 将原字符串的前 time 个字符(即 "AB")拼接到 tmp 的末尾,形成最终结果。例如,当 tmp = "CD"time = 2 时,拼接后结果为 tmp = "CDAB"
  • 最后使用 strcpytmp 的内容复制回原字符串 str,完成旋转操作。

时间复杂度和空间复杂度

  • 时间复杂度:O(n),只需遍历字符串几次即可完成旋转。
  • 空间复杂度:O(n),需要额外的存储空间来保存旋转后的结果。

优缺点

  • 辅助空间法的优势在于其高效的操作,尤其适合处理较大的字符串,但需要额外的空间来存储结果。因此,对于内存资源受限的情况,该方法可能不太适合。

💯方法三:三次反转法

思路

三次反转法通过对字符串的部分片段进行反转,从而达到整体左旋的效果。核心思想是将字符串划分为两部分,分别反转,再对整体反转,以实现最终的左旋

这种方法以极少的操作步骤完成字符位置的重新排列,具有较高的效率数学美感

在这里插入图片描述

代码实现

void ReverseRange(char* str, int start, int end) {int left = start;int right = end;while (left < right) {char tmp = str[left];str[left] = str[right];str[right] = tmp;left++;right--;}
}void leftRound(char* str, int k) {int len = strlen(str);int time = k % len;ReverseRange(str, 0, time - 1);    // 反转前 time 个字符ReverseRange(str, time, len - 1);  // 反转剩余部分ReverseRange(str, 0, len - 1);     // 反转整个字符串
}int main() {char str[] = "abcdef";leftRound(str, 7);printf("%s\n", str);return 0;
}

解释

  1. 反转前 time 个字符

    • 调用 ReverseRange(str, 0, time - 1),反转字符串的前 time 个字符。
    • 例如,对 "ABCD" 反转前两个字符,得到 "BACD"
  2. 反转剩余部分

    • 调用 ReverseRange(str, time, len - 1),反转剩余部分。
    • "BACD" 中的后两个字符反转,得到 "BADC"
  3. 反转整个字符串

    • 调用 ReverseRange(str, 0, len - 1),反转整个字符串。
    • "BADC" 反转得到 "CDAB",从而完成左旋操作。

时间复杂度和空间复杂度

  • 时间复杂度:O(n),三次反转操作均为线性时间复杂度,因此总时间复杂度为 O(n)
  • 空间复杂度:O(1),只需进行交换操作,没有额外的空间开销。

优缺点

  • 三次反转法的优势在于其高效性,时间复杂度为 O(n),空间复杂度为 O(1),适合处理大规模字符串。该方法通过反转实现字符串的重新排列,以最小的时间和空间成本实现左旋,非常适合实际开发中的高效实现。

💯方法对比与总结

方法时间复杂度空间复杂度优点缺点
逐字符移动法O(k * n)O(1)实现简单,直观效率较低
辅助空间法O(n)O(n)实现高效,代码简洁需要额外空间
三次反转法O(n)O(1)高效且无额外空间开销实现稍复杂,需要三次反转
  • 逐字符移动法 适合初学者理解字符串旋转的概念,但效率不高。在字符较多或者旋转次数较大时,可能会因为需要逐次移动而显得低效
  • 辅助空间法 则通过一次性拼接字符串提升了效率,但需要额外的空间存储,对于空间资源紧张的场景可能不适合
  • 三次反转法最优的方法,尤其适合大规模字符串。它的空间复杂度最低效率高,是一个非常经典的字符串操作技巧。该方法不仅巧妙而且具有一定的数学美感,通过三次反转将字符串重新排列到目标位置。

拓展思考

  • 这些字符串旋转的实现方法可以拓展到其他类型的数据结构,例如数组的左旋、右旋操作。对于数组来说,三次反转法同样有效,可以通过类似的思路对数组元素进行重新排列。
  • 三次反转法的思想不仅可以用于字符串旋转,还可以用于链表数组等其他序列的数据结构。它是一种通用的思想,可以帮助解决许多涉及顺序调整的问题。
  • 对于多种编程语言,我们也可以找到相似的实现方法。Python 中可以使用字符串切片操作来轻松实现左旋,而 Java 中可以借助 StringBuilder 进行高效的字符串操作。Python 的切片方法非常直观,例如可以使用 s = s[k:] + s[:k] 来实现左旋操作,简洁而高效。
  • 对于面试场景,理解这些方法的时间复杂度空间复杂度,以及不同方法在实际应用中的适用性非常重要。面试官通常希望看到你对基础方法的掌握以及对最优解法的深入理解。

💯总结

  • 在这里插入图片描述
    字符串左旋是一个非常基础但又非常经典的字符串操作问题。通过这篇文章的深入解读,我们详细探讨了三种不同的解决方案,并对每种方法的算法复杂度适用场景优缺点进行了深入分析。掌握这些方法有助于我们在面试中应对字符串操作类的问题,也能帮助我们在实际开发中写出更优雅、高效的代码。这三种方法展示了从基础到高效的不同解决思路,是学习和掌握字符串操作的宝贵经验
    希望这篇文章能够激发你对字符串操作的更深入思考与理解。未来的学习和工作中,愿你能够灵活应用这些技巧,优化代码的效率与可读性,深入理解不同方法背后的原理,并能够在解决问题时选择最合适的工具。这正是编程的艺术,也是不断提升的动力所在

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/481003.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

肿瘤微环境中单细胞的泛癌分类

scRNA-seq可以揭示肿瘤微环境 (TME) 内细胞异质性的宝贵见解&#xff0c;scATOMIC是一种用于恶性和非恶性细胞的注释工具。在 300,000 个癌症、免疫和基质细胞上训练了 scATOMIC&#xff0c;为 19 种常见癌症定义了一个泛癌症参考&#xff0c;scATOMIC优于当前的分类方法。在 2…

《算法导论》英文版前言To the teacher第3段研习录:题海战术有没有?

【英文版】 We have included 957 exercises and 158 problems. Each section ends with exercises, and each chapter ends with problems. The exercises are generally short questions that test basic mastery of the material. Some are simple self-check thought exer…

docker使用(镜像、容器)

docker基础使用 文章目录 前言1.镜像操作1.1命令介绍1.2.案例实操1.2.1查找镜像1.2.2下载镜像1.2.3查看当前镜像 2.容器操作2.1命令2.1.1容器创建与启动2.1.2. 容器查看2.1.3. 容器操作2.1.4. 容器删除2.1.5. 容器日志2.1.6. 容器内文件操作2.1.7. 容器内命令执行2.1.8. 其他常…

自编码器(二)

自编码器到底好在哪里&#xff1f;当我们把一个高维度的图片&#xff0c;变成一个低维度的向量的时候&#xff0c;到 底带来什么样的帮助呢&#xff1f;我们来设想一下&#xff0c;自编码器这件事情它要做的&#xff0c;是把一张图片压缩 又还原回来&#xff0c;但是还原这件事…

springboot旅游管理系统的设计与实现

springboot旅游管理系统的设计与实现 如需源码pc端&#x1f449;&#x1f449;&#x1f449;资源 手机端&#x1f449;&#x1f449;&#x1f449;资源 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于…

SQL进阶——子查询与视图

在SQL中&#xff0c;子查询和视图是两种强大的技术&#xff0c;用于处理复杂的查询、提高代码的重用性以及优化查询性能。子查询允许开发者在查询中嵌套其他查询&#xff0c;而视图则是对复杂查询的封装&#xff0c;可以简化开发工作并提高代码的可维护性。 本章将深入探讨如何…

【组成原理】计算机硬件设计——ALU

2bit 复用器 A B C D 为该元件的4个输入口&#xff0c;假设 输入口都是 4位&#xff0c;故 数据输入范围 是 0~ 16. Sel是2位选择开关&#xff0c;可以标识 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;这样可以实现控制4个输入的选择。 元件外观&#xff1a; 二、…

基于MFC实现的银行模拟系统

基于MFC实现的银行模拟系统 1.软硬件运行环境 1.1 项目研究背景与意义 为了能给学生熟悉银行业务系统提供真实的操作环境, 使学生在掌握理论知识的同时熟悉银行业务的实际操作过程&#xff0c;改变其知识结构&#xff0c;培养商业银行真正需要的实用人才&#xff0c;增强学生…

【LeetCode每日一题】——189.轮转数组

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【解题思路】九【时空频度】十【代码实现】十一【提交结果】 一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 189.轮转数组 四【题目描述】 …

滑动窗口篇——如行云流水般的高效解法与智能之道(3)

前言&#xff1a; 上篇我们介绍了滑动窗口的进阶练习&#xff0c;本篇难度继续升级&#xff0c;同样结合具体题目&#xff0c;帮助大家进一步掌握和运用滑动窗口。 一. 找到字符串中所有字母异位词 题目链接&#xff1a;438. 找到字符串中所有字母异位词 - 力扣&#xff08;L…

uniapp首页样式,实现菜单导航结构

实现菜单导航结构 1.导入字体图标库需要的文件 2.修改引用路径iconfont.css 3.导入到App.vue中 <style>import url(./static/font/iconfont.css); </style>导航区域代码 VUE代码 <template><view class"home"><!-- 导航区域 --><…

Rust SQLx CLI 同步迁移数据库

上文我们介绍了SQLx及SQLite&#xff0c;并介绍了如何使用代码同步迁移数据库。本文介绍Sqlx cli 命令行工具&#xff0c;介绍如何安装、使用&#xff0c;利用其提供的命令实现数据表同步迁移。Java生态中有flyway, sqlx cli 功能类似&#xff0c;利用命令行工具可以和其他语言…

【天地图】HTML页面实现车辆轨迹、起始点标记和轨迹打点的完整功能

目录 一、功能演示 二、完整代码 三、参考文档 一、功能演示 运行以后完整的效果如下&#xff1a; 点击开始&#xff0c;小车会沿着轨迹进行移动&#xff0c;点击轨迹点会显示经纬度和时间&#xff1a; 二、完整代码 废话不多说&#xff0c;直接给完整代码&#xff0c;替换…

鸿蒙学习自由流转与分布式运行环境-价值与架构定义(1)

文章目录 价值与架构定义1、价值2、架构定义 随着个人设备数量越来越多&#xff0c;跨多个设备间的交互将成为常态。基于传统 OS 开发跨设备交互的应用程序时&#xff0c;需要解决设备发现、设备认证、设备连接、数据同步等技术难题&#xff0c;不但开发成本高&#xff0c;还存…

如何启动 Docker 服务:全面指南

如何启动 Docker 服务:全面指南 一、Linux 系统(以 Ubuntu 为例)二、Windows 系统(以 Docker Desktop 为例)三、macOS 系统(以 Docker Desktop for Mac 为例)四、故障排查五、总结Docker,作为一种轻量级的虚拟化技术,已经成为开发者和运维人员不可或缺的工具。它允许用…

Mac启动服务慢问题解决,InetAddress.getLocalHost().getHostAddress()慢问题。

项目启动5分钟&#xff0c;很明显有问题。像网上其他的提高jvm参数就不说了&#xff0c;应该不是这个问题&#xff0c;也就快一点。 首先找到自己的电脑名称&#xff08;用命令行也行&#xff0c;只要能找到自己电脑名称就行&#xff0c;这里直接在共享里看&#xff09;。 复制…

实时美颜直播APP开发指南:美颜sdk与美颜api的应用实践

本篇文章&#xff0c;小编将探讨如何在直播APP中实现实时美颜功能&#xff0c;重点介绍美颜sdk与api的应用实践。 一、什么是实时美颜技术&#xff1f; 实时美颜技术&#xff0c;通常通过图像处理算法&#xff0c;基于主播或用户的实时视频流&#xff0c;进行面部特征的优化。…

【纯原生js】原生实现h5落地页面中的单选组件按钮及功能

h5端的按钮系统自带的一般都很丑&#xff0c;需要我们进行二次美化&#xff0c;比如单选按钮复选框之类的&#xff0c;那怎么对其进行html和css的改造&#xff1f; 实现效果 实现代码 <section id"tags"><h2>给景区添加标题</h2><label><…

win10系统安装docker-desktop

1、开启Hyper-v ———————————————— Hyper-V 是微软提供的一种虚拟化技术&#xff0c;它允许你在同一台物理计算机上运行多个独立的操作系统实例。这种技术主要用于开发、测试、以及服务器虚拟化等领域。 —————————————————————— &#…

阿里云人工智能平台(PAI)免费使用教程

文章目录 注册新建实例交互式建模(DSW)注册 注册阿里云账号进行支付宝验证 新建实例 选择资源信息和环境信息,填写实例名称 资源类型需要选择公共资源,才能使用资源包进行抵扣。目前每月送250计算时。1 * NVIDIA A10 8 vCPU 30 GiB 1 * 24 GiB1 * NVIDIA V100 8 vCPU 32 Gi…