龙空技术网

LeetCode基础算法题第130篇:反转字符串 II

吾是我师 1623

前言:

当前大家对“c语言字符翻转”大体比较珍视,朋友们都想要了解一些“c语言字符翻转”的相关知识。那么小编同时在网络上收集了一些关于“c语言字符翻转””的相关资讯,希望咱们能喜欢,你们快快来了解一下吧!

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我。

我会持续分享下去,敬请您的关注。

LeetCode 541. 反转字符串 II(Reverse String II)

问题描述:

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

注:

该字符串只包含小写的英文字母。给定字符串的长度和 k 在[1, 10000]范围内。示例:C语言实现:

我觉得LeetCode提供的示例不能清晰反映这个问题,所以我给了一个新的示例,这是当k=3的时候,不同的s值,reverseStr函数返回的结果:

(注意图中标注红绿色的都是要进行反转的,之说以标注不同,是因为是在不同的划分中。)

根据如上图的观察,我们会发现,这个题目实际上是要实现:

从s的左边开始,按步长为k,将字符串划分成多个逻辑部分;若将每次的划分用下标标注的话(起始下标是0),那么对偶数下标的划分做反转操作,奇数下标不做任何变化。

如此我们就可得出如下的算法:

代码14~16行复制字符串s给res,对res进行操作,避免修改s。

代码18~19行,表里按照步长k遍历字符串res。

每一循环,判断当前划分是否是偶划分,如果是对res中改区域的逻辑划分执行翻转操作。

函数resverse,对字符串中某一区域执行做反转操作。

这里注意right值的取值是取逻辑划分边界和字符下标的最小值。

反转的方式是对逻辑划分的字符子串不断的进行左右字符的交换,这里定义了一个宏SWP来完成这个工作。

Java语言实现:

Java 的实现和C语言的实现基本一致,不再撰述。代码如下:

Python语言实现:

当然你依然可以用上面的方法,只是你要通过判断奇偶划分来确定是否要反转。

由于python切片没有溢出的问题,所以根据题目描述的k与2k的关系,对于python来说可以方便的实现算法。

代码如下:

谢谢大家一直以来的关注和支持!

我一直在努力的写好每一篇文章,画好每一份插图。但是作为一个996从业人员,时间精力十分有限。所以针对评论部分,以后只回答粉丝的问题和私信。希望仅仅是路过的朋友能够体谅,希望更多人关注《吾是我师》,谢谢!

标签: #c语言字符翻转