反转字符串不是关键,重要的是我想说...

简介: 反转字符串不是关键,重要的是我想说...

大家好呀,我是反转蛋。

今天是反转字符串,一道简单到扣脚的题。


简单到什么地步咧?


我看到这么一句话:真是真正意义上能让我重拳出击的第一道题。


不得不说,看到这我还是有受到侮辱的感觉的。


这也太厉害了吧,我重拳出击的第一道题才是“Hello World”。

640.jpg


那么,为啥这么简单我还要写这道题呢?


先不告诉你,往下看就完事了。

640.png


   LeetCode 344:反转字符串



题意


编写一个函数,将输入的字符串反转过来。


示例


输入:s = ["h", "e", "l", "l", "o"]

输出:["o", "l", "l", "e", "h"]


提示


必须原地修改输入数组,使用 O(1) 的额外空间解决这一问题。


  • 1 <= s.length <= 10^5
  • s[i] 都是 ASCII 码表中的可打印字符。


题目解析


水题,难度简单。


就是将 s[0] s[1] ... s[n-1] 以 s[n-1] ... s[1] s[0] 的形式输出,即 s[i] 和 s[n - i - 1] 交换位置。


那我们可以使用双指针的方式解决这道问题,维护一个左指针 left 和右指针 right。


初始化 left 指向数组首元素,right 指向数组右元素。


当 left < right 的时候,交换 s[left] 和 s[right],同时 left 右移,right 左移。


题目解析说到这,反转字符串不是关键,重要的是我想说...

网络异常,图片无法展示
|

我猜很多小婊贝在做这道题的时候一行代码就解决了这道反转字符串。


毕竟对于想 Python、Java 这种编程语言,是自带很多的库函数,尤其像字符串这种在实际工程中经常要处理的玩意儿,库函数那是数不胜数。


像什么反转字符串,我 Python 直接 reversed 一下多酷多省事,操作多骚,我还用啥双指针,有毛病?


其实这恰恰是我想要你不要做的。你要知道我们现在在这练习,在这刷题的目的是什么


只是为了完成这道题,提交以后 AC 了就完事了么?


不是。如果你这样想你就错了。


我们的目的是为了学会,学到根子里去。


像这种直接用库函数就能做出来的题,我希望你回归本真,去用你自己想的解决方式去解决这个问题,这样才能慢慢加深你对数据结构和算法的理解,这样最后对你的好处是巨大的。


言止于此,希望你能听进去,希望你一定要听进去。

640.gif

图解


以 s = ["h", "e", "l", "l", "o"] 为例,先初始化双指针。

640.png


# 初始化双指针
left = 0
right = len(s) - 1

第 1 步,left = 0,right = 4,left < right,交换两个元素。

640.png

while left < right:
    s[left], s[right] = s[right], s[left]

left 向右移动 1,right 向左移动 1,此时 left = 1,right = 3。


left += 1
right -= 1

640.png

第 2 步,left < right,交换两个元素。

640.png


left 向右移动 1,right 向左移动 1,此时 left = right,结束。


640.png


返回字符串 s = ["o", "l", "l", "e", "h"]


本题解一共执行了 n/2 次操作,所以时间复杂度为 O(n)


除此以外只用了额外的两个指针存放变量,所以空间复杂度为 O(1)


代码实现


Python 代码实现

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        # 初始化双指针
        left = 0
        right = len(s) - 1
        # 这种方法可以不用判断元素奇偶
        while left < right:
            s[left], s[right] = s[right], s[left]
            #交换后,左指针右移,右指针左移
            left += 1
            right -= 1

Java 代码实现

class Solution {
    public void reverseString(char[] s) {
        int n = s.length;
        for (int left = 0, right = n - 1; left < right; ++left, --right) {
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
        }
    }
}



好啦,图解反转字符串到这就结束啦。


这是字符串系列的开胃小菜,准备好后面的挑战了嘛?


不要忘记给我的点赞在看和么么哒呀。


我是帅蛋,我们下次见~



640.gif



相关文章
|
存储 C语言
C 语言文件读取全指南:打开、读取、逐行输出
要从文件读取,可以使用 r 模式: FILE *fptr; // 以读取模式打开文件 fptr = fopen("filename.txt", "r"); 这将使 filename.txt 打开以进行读取。 在 C 中读取文件需要一点工作。坚持住!我们将一步一步地指导您。 接下来,我们需要创建一个足够大的字符串来存储文件的内容。 例如,让我们创建一个可以存储多达 100 个字符的字符串:
1867 2
C 语言文件读取全指南:打开、读取、逐行输出
|
存储 Python
Python中encode和encoding的区别
Python中encode和encoding的区别
465 0
|
8月前
|
存储 弹性计算 网络协议
阿里云服务器ECS实例规格族详细介绍:计算型c9i、经济型e和通用算力u1实例CPU参数说明
阿里云ECS实例规格族包括计算型c9i、经济型e和通用算力型u1等,各自针对不同场景优化。不同规格族在CPU型号、主频、网络性能、云盘IOPS等方面存在差异,即使CPU内存相同,性能和价格也不同。
883 0
|
存储 缓存 资源调度
研究一下「pnpm」这个神奇的包管理工具
研究一下「pnpm」这个神奇的包管理工具
1153 0
|
存储 弹性计算 安全
阿里云创业者计划解读,创业者计划主要内容、申请流程及常见问题解答
目前越来越多的初创企业开始意识到云计算在提升业务效率和降低成本方面的重要性。但是对于许多初创企业来说,由于缺乏技术资源和资金,上云之路并不平坦。为了解决这一问题,阿里云推出了创业者计划,旨在为初创企业提供全方位的赋能与服务,助力其在阿里云上快速构建自己的业务,开启智能时代创业新范式。
阿里云创业者计划解读,创业者计划主要内容、申请流程及常见问题解答
|
Linux 调度 开发工具
云桌面系统镜像文件快速分发方案分享SDK
为了解决云桌面环境下批量升级系统镜像的效率问题,传统的1对多FTP/HTTP方式因服务器带宽限制导致传输慢。一种基于优化的Bittorrent协议的P2P解决方案被提出,利用P2P技术将文件切块并让终端互相分享,提高下载速度,尤其适合大文件如256GB分区镜像的分发。通过自定义IO接口、跳过校验、超大分块、多分块支持及局域网自建Tracker等功能,实现更快的传输和镜像更新,适用于系统镜像、游戏更新等领域。该方案已广泛应用于各行业,可根据不同场景定制优化。
429 1
|
存储 缓存 监控
使用 Scapy 库编写 ARP 拒绝服务攻击脚本
使用 Scapy 库编写 ARP 拒绝服务攻击脚本
|
机器学习/深度学习 人工智能 自然语言处理
构建未来:移动应用中的人工智能集成与用户体验优化
【4月更文挑战第3天】 随着人工智能技术的不断进步,移动应用领域正在经历一场革命。本文将深入探讨移动应用中人工智能集成的最新趋势,以及如何通过这些技术提升用户体验。我们将分析自然语言处理、机器学习和计算机视觉等AI技术在移动应用中的具体应用场景,并讨论它们对用户互动、个性化服务和智能推荐系统的影响。此外,文章还将提出一系列策略,帮助开发者在保持用户隐私和数据安全的前提下,有效地集成人工智能功能。
|
数据采集 搜索推荐
标准审批灵活配置助力高效组织流程管理
Dataphin 在 V3.14 版本中对标准审批设置功能进行了全面升级,支持按照标准集粒度对不同数据标准的审批流程进行配置:上线、下线审批可独立配置,支持免审批;此外,Dataphin 支持设置不同模块的审批流程使用的审批系统(内置或第三方审批系统),从而将标准管理流程和且 OA 流程进行更好的结合,助力提升组织流程的管理效率,推动业务发展。
462 1
|
安全 JavaScript 前端开发
第十六届山东省职业院校技能大赛中职组 “网络安全”赛项竞赛试题—B模块安全事件响应/网络安全数据取证/应用安全
该内容描述了一次网络安全演练,包括七个部分:Linux渗透提权、内存取证、页面信息发现、数字取证调查、网络安全应急响应、Python代码分析和逆向分析。参与者需在模拟环境中收集Flag值,涉及任务如获取服务器信息、提权、解析内存片段、分析网络数据包、处理代码漏洞、解码逆向操作等。每个部分都列出了若干具体任务,要求提取或生成特定信息作为Flag提交。
532 0