当前位置: 首页 > article >正文

每日一题(LeetCode)----字符串--反转字符串 II

每日一题(LeetCode)----字符串–反转字符串 II

1.题目(541. 反转字符串 II)

  • 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

    • 如果剩余字符少于 k 个,则将剩余字符全部反转。
    • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

    示例 1:

    输入:s = "abcdefg", k = 2
    输出:"bacdfeg"
    

    示例 2:

    输入:s = "abcd", k = 2
    输出:"bacd"
    

    提示:

    • 1 <= s.length <= 104
    • s 仅由小写英文组成
    • 1 <= k <= 104

2.解题思路

思路一:找到要反转的子串使用双指针实现反转

1.我们先看需要反转几次

反转的次数分为两部分 一部分是我们用字符串的总长度除以2*k得到的数 另一部分是字符串的总长度取余2 * k后得到的数与k和2 * k进行对比,以判断剩下的字符串是否需要进行反转

2.创建两个指针来对要进行反转的地方进行反转

思路:找到要反转的子串使用库函数实现反转

反转每个下标从 2k的倍数开始的,长度为 k的子串。若该子串长度不足 k,则反转整个子串。

作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-string-ii/

3.写出代码

思路一的代码

class Solution {
public:
    string reverseStr(string s, int k) {
        int length=s.size();

        int loop=length/(2*k);
        int residue=length%(2*k);
        char* left=&s[0];
        char* right=left+k-1;
        char* leTemp;
        char* riTemp;
        while(loop--){
            leTemp=left;
            riTemp=right;
            while(riTemp>leTemp){
                if((*leTemp)!=(*riTemp)){
                (*leTemp)=(*leTemp)^(*riTemp);
                (*riTemp)=(*leTemp)^(*riTemp);
                (*leTemp)=(*leTemp)^(*riTemp);
                }
                leTemp++;
                riTemp--;
            }
            left+=2*k;
            right=left+k-1;
        }

        if(residue<k){
            right=left+residue-1;

            leTemp=left;
            riTemp=right;
            while(riTemp>leTemp){
                if((*leTemp)!=(*riTemp)){
                (*leTemp)=(*leTemp)^(*riTemp);
                (*riTemp)=(*leTemp)^(*riTemp);
                (*leTemp)=(*leTemp)^(*riTemp);
                }
                leTemp++;
                riTemp--;
            }
        }

        if(residue>=k&&residue<2*k){
            leTemp=left;
            riTemp=right;
            while(riTemp>leTemp){
                if((*leTemp)!=(*riTemp)){
                (*leTemp)=(*leTemp)^(*riTemp);
                (*riTemp)=(*leTemp)^(*riTemp);
                (*leTemp)=(*leTemp)^(*riTemp);
                }
                leTemp++;
                riTemp--;
            }
        }
        return s;
    }
    
};

思路二的代码

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.length();
        for (int i = 0; i < n; i += 2 * k) {
            reverse(s.begin() + i, s.begin() + min(i + k, n));
        }
        return s;
    }
};

作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-string-ii/

http://www.kler.cn/a/159262.html

相关文章:

  • python的matplotlib实现数据分析绘图
  • MySQL Online DDL
  • 坚果云·无法连接服务器(无法同步)
  • JVM双亲委派与自定义类加载器
  • python selenium库的使用:通过兴趣点获取坐标
  • 计算机网络(11)和流量控制补充
  • 15、pytest的fixture调用fixture
  • 一部,即全部,十年超越之作一加12售价4299元起
  • C++ 函数详解
  • 高级搜索——伸展树Splay详解
  • 5-Tornado入门、程序的原理图、tornado不能使用同步代码的演示
  • Day14——数据结构和集合源码
  • Codeforces Round 913 (Div. 3)(A~G)
  • 网络安全威胁——中间人攻击
  • 牛客算法心得——kotori和素因子(dfs)
  • RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法
  • WeakMap
  • Python实现FA萤火虫优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战
  • 17.认识下Docker之docker的核心原理(2)
  • 商务助理个人简历10篇
  • 轻量封装WebGPU渲染系统示例<40>- 多层材质的Mask混合(源码)
  • 解决终Linux端中文乱码问题及设置UTF-8编码
  • HarmonyOS4.0开发应用——【ArkUI组件使用】
  • 第二十一章 网络通信
  • 软著项目推荐 深度学习的水果识别 opencv python
  • Java数据结构之《最短路径》(难度系数100)