反转字符串
不能给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
我们直接用双指针,一个指头一个指尾,swap交换,然后同时往中间走一步再进入循环交换即可。
反转字符串II
这道题我们容易搞复杂了 其实代码可以很简洁。
比如,我们习惯i++,然后搞个count计数到2k再进入下一个翻转。但是这里其实可以直接i+=2k,即在i到i+=2k内做完题目要求的翻转后,直接开始下一个2k内的翻转处理。
比如我们到了尾部(即后面不够2k)再分两情况讨论,一个是不够2k但是等于或者大于k,一个是小于k。但是这里其实可以发现不够2k但是等于或者大于k的情况是怎么处理的呢?是让i至k的进行翻转,那就是和我们处理前面2k内的对i至k的进行翻转,所以可以一起处理的。
怎么写代码可以使得这两种情况可以一起处理呢?
if(i+k<=s.size()){
reverse(s.begin()+i,s.begin()+i+k);
}
i+k还小于等于s.size,说明还有一小节加起来才等于s的长度,说明是不够2k但是等于或者大于k的情况。前面那一坨坨2k的更是i+k肯定小于s.size,因为还有后面k个嘛怎么都小于s的长度。所以就可以一起处理了。
剩下的情况就是结尾那坨长度连k都不够,那就直接else翻转到字符串s的结尾即可,
{reverse(s.begin()+i),s.end()}