字符串|541.反转字符串||

news/2024/7/24 13:27:36 标签: 算法

力扣题目链接

使用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 );
            } else {
                // 3. 剩余字符少于 k 个,则将剩余字符全部反转。
                reverse(s.begin() + i, s.end());
            }
        }
        return s;
    }
};

不用库函数:

class Solution {
public:
    void reverse(string& s, int start, int end) {
        for (int i = start, j = end; i < j; 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;
    }
};

c语言代码:

char * reverseStr(char * s, int k){
    int len = strlen(s);

    for (int i = 0; i < len; i += (2 * k)) {
        //判断剩余字符是否少于 k
        k = i + k > len ? len - i : k;

        int left = i;
        int right = i + k - 1;
        while (left < right) {
            char temp = s[left];
            s[left++] = s[right];
            s[right--] = temp;
        }
    }

    return s;
}

看了一次成功敲出~

 

 一、出错点

1.对于for循环里面的条件理解不清楚

2.对于if判断里面的条件理解不清楚

二、理解后的思路

这道题目其实也是模拟,实现题目中规定的反转规则就可以了。

一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。

其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。

因为要找的也就是每2 * k 区间的起点,这样写,程序会高效很多。

所以当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。

代码随想录 (programmercarl.com)

三、总结

字符串反转的关键就是找准判断条件

然后多看题,看代码,多敲代码,直到自己独立敲出代码,理解思路。


http://www.niftyadmin.cn/n/5424828.html

相关文章

Docker进阶:深入了解容器数据卷

Docker进阶&#xff1a;深入了解容器数据卷 一、前言二、容器数据卷的作用三、容器数据卷的使用方法四、实战--使用docker部署前端项目&#xff08;数据卷挂载&#xff09;4.1 重要&#xff1a;准备工作&#xff0c;先在本地创建挂载目录4.2 启动一个临时的nginx容器&#xff0…

opencv读写cv::Mat的像素

opencv图像都是抽象成cv::Mat类&#xff0c;一个像素矩阵&#xff0c;通过at<像素具体类型>(行&#xff0c;列)来读写像素&#xff0c;他的实现是这么一句 return ((_Tp*)(data step.p[0] * i0))[i1]; 意思是这个矩阵按一行一行的存在data这块内存中&#xff0c;通过i0…

leetcode 热题 100_合并两个有序链表

题解一&#xff1a; 迭代&#xff1a;分别用两个指针遍历两段链表&#xff0c;逐步比较两链表的节点&#xff0c;将值较大的节点存入新链表&#xff0c;同时指针移动&#xff0c;直到某段链表遍历结束&#xff0c;将另一段链表剩余的节点存入新链表。需要注意存入新链表时要用新…

【硬件基础】电容的选型

1、电容的理论基础 电容器的本质就是储能&#xff0c;充放电 根据作用可分为&#xff1a;滤波电容&#xff0c;旁路电容&#xff0c;耦合电容&#xff0c;退耦电容&#xff0c;自举电容 2、电容的取值 计算取值&#xff0c;查手册&#xff0c;经验取值 3、电容的选取 分为铝…

探索TikTok云手机在社交媒体营销的作用

近年来&#xff0c;TikTok作为全球短视频平台之一&#xff0c;其用户基数呈现持续增长的趋势。伴随社交媒体的蓬勃发展&#xff0c;企业和个人纷纷涌入TikTok平台&#xff0c;追求更广泛的曝光和用户互动。为满足这一需求&#xff0c;TikTok云手机应运而生。本文将深度剖析TikT…

docker部署rustdesk远程控制服务器

文章目录 前言一、rustdesk是什么&#xff1f;二、服务端配置1.安装docker2、拉取镜像3、运行容器3、防火墙配置 三、客户端配置 前言 本实例主要方便在内网没有远程控制环境下使用 一、rustdesk是什么&#xff1f; rustdesk是github上一个开源的远程控制项目。 二、服务端…

十二、软考-系统架构设计师笔记-信息系统架构设计理论与实践

1、信息系统架构基本概念及发展 信息系统架构的定义 信息系统架构是该系统的一个(或多个)结构&#xff0c;而结构由软件元素、元素的外部可见属性及它们之间的关系组成。 信息系统架构分类 信息系统架构分为物理结构与逻辑结构两种&#xff1a; 物理结构是指不考虑系统各部分…

【JS逆向学习】猿人学第六题 js混淆 回溯

逆向目标 网址&#xff1a;https://match.yuanrenxue.cn/match/6接口&#xff1a;https://match.yuanrenxue.cn/api/match/6参数&#xff1a;payload(m、q) 逆向过程 老规矩&#xff0c;先来分析网络请求&#xff0c;加密的地方一目了然&#xff0c;没什么可多说的&#xff…