leetcode 541 反转字符串II

缺乏、安全感 2022-09-10 00:14 125阅读 0赞

前言

题目:541. 反转字符串 II

参考答案:反转字符串 II-力扣官方题解


提交代码

字符串翻转的模拟题。

我没有原位翻转,所以代码略微复杂了些。我尽可能将代码写的好看精简。

  1. class Solution {
  2. public:
  3. string reverseStr(string s, int k) {
  4. string result;
  5. int reverseNum = s.size()/(2*k);
  6. int leaveNum = s.size()%(2*k) >= k ? 1 : 0 ; // 剩余字符小于2k&&大于等于k,用1标识;小于k用0标识。
  7. // 每2k个字符,翻转前k个
  8. for(int i=0; i<reverseNum; i++){
  9. reverse_copy(s.begin()+i*2*k,s.begin()+i*2*k+k,back_inserter(result));
  10. copy(s.begin()+i*2*k+k,s.begin()+i*2*k+2*k,back_inserter(result));
  11. }
  12. // 处理剩余的字符
  13. if(leaveNum == 0){ // 剩余字符<k
  14. reverse_copy(s.begin()+reverseNum*2*k,s.end(),back_inserter(result));
  15. }else{ // k<=剩余字符<2k
  16. reverse_copy(s.begin()+reverseNum*2*k,s.begin()+reverseNum*2*k+k,back_inserter(result));
  17. copy(s.begin()+reverseNum*2*k+k,s.end(),back_inserter(result));
  18. }
  19. return result;
  20. }
  21. };

参考答案采用原位翻转是比较合理的操作。因为传入的是字符串的拷贝,原位翻转不会影响原来的字符串。原位翻转,只需要一个指针累加,处理起来也更加方便。下面是参考答案的代码。

  1. class Solution {
  2. public:
  3. string reverseStr(string s, int k) {
  4. int n = s.length();
  5. for (int i = 0; i < n; i += 2 * k) {
  6. reverse(s.begin() + i, s.begin() + min(i + k, n));
  7. }
  8. return s;
  9. }
  10. };

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读

    相关 541. 字符串 II

    给定一个字符串 s 和一个整数 k,从字符串开头算起,每 2k 个字符反转前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大

    相关 LeetCode541. 字符串 II

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

    相关 541. 字符串 II

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