【霍比特交易所下载】字符串:简单的反转还不够!
摘要:给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
来源:代码随想录-程序员 Carl
题目:541. 反转字符串 II
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 :
输入 : s = "abcdefg", k = 2
输出 : "bacdfeg"
思路
这道题目其实也是模拟,实现题目中规定的反转规则就可以了。
一些同学可能为了处理逻辑:每隔 2k 个字符的前 k 的字符,写了一堆逻辑代码或者再搞一个计数器,来统计 2k,再统计前 k 个字符。
其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
因为要找的也就是每 2 * k 区间的起点,这样写程序会高效很多。
「所以当需要固定规律一段一段去处理字符串的时候,要想想在在 for 循环的表达式上做做文章。」
那么这里具体反转的逻辑我们要不要使用库函数呢,其实用不用都可以,使用 reverse 来实现反转也没毛病,毕竟不是解题关键部分。
C++代码
使用 C++库函数 reverse 的版本如下:
class Solution { public: string reverseStr(string s, int k) { for (int i = 0; i < s.size(); i += (2 * k)) { // 1. 每隔 2k 个字符的前 k 个字符进行反转 // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符 if (i + k <= s.size()) { reverse(s.begin() + i, s.begin() + i + k ); continue; } // 3. 剩余字符少于 k 个,则将剩余字符全部反转。 reverse(s.begin() + i, s.begin() + s.size()); } return s; } };
那么我们也可以实现自己的 reverse 函数。
下面我实现的 reverse 函数区间是左闭右闭区间,代码如下:
class Solution { public: void reverse(string& s, int start, int end) { int offset = (end - start + 1) / 2; for (int i = start, j = end; i < start + offset; i++, j--) { swap(s[i], s[j]); } } string reverseStr(string s, int k) { for (int i = 0; i < s.size(); i += (2 * k)) { // 1. 每隔 2k 个字符的前 k 个字符进行反转 // 2. 剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符 if (i + k <= s.size()) { reverse(s, i, i + k - 1); continue; } // 3. 剩余字符少于 k 个,则将剩余字符全部反转。 reverse(s, i, s.size() - 1); } return s; } };
- 免责声明
- 世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
- 风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
- 世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。