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

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

大家好呀,我是反转蛋。

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


简单到什么地步咧?


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


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


这也太厉害了吧,我重拳出击的第一道题才是“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



相关文章
|
存储 Python
Python中encode和encoding的区别
Python中encode和encoding的区别
241 0
|
数据可视化 Linux 网络安全
CentOS7.9下离线安装OctoMation编排自动化SOAR开源社区免费版
CentOS7.9下离线安装OctoMation编排自动化SOAR开源社区免费版
414 0
|
10月前
|
人工智能 运维 监控
智能运维在现代数据中心的应用与挑战
随着云计算和大数据技术的迅猛发展,现代数据中心的运维管理面临着前所未有的挑战。本文探讨了智能运维技术在数据中心中的应用,包括自动化监控、故障预测与诊断、资源优化等方面,并分析了当前面临的主要挑战,如数据安全、系统集成复杂性等。通过实际案例分析,展示了智能运维如何帮助数据中心提高效率、降低成本,并提出了未来发展趋势和建议。
|
Linux 调度 开发工具
云桌面系统镜像文件快速分发方案分享SDK
为了解决云桌面环境下批量升级系统镜像的效率问题,传统的1对多FTP/HTTP方式因服务器带宽限制导致传输慢。一种基于优化的Bittorrent协议的P2P解决方案被提出,利用P2P技术将文件切块并让终端互相分享,提高下载速度,尤其适合大文件如256GB分区镜像的分发。通过自定义IO接口、跳过校验、超大分块、多分块支持及局域网自建Tracker等功能,实现更快的传输和镜像更新,适用于系统镜像、游戏更新等领域。该方案已广泛应用于各行业,可根据不同场景定制优化。
227 1
|
存储 缓存 资源调度
研究一下「pnpm」这个神奇的包管理工具
研究一下「pnpm」这个神奇的包管理工具
857 0
|
存储 缓存 监控
使用 Scapy 库编写 ARP 拒绝服务攻击脚本
使用 Scapy 库编写 ARP 拒绝服务攻击脚本
|
Linux Shell 调度
介绍BootLoader、PM、kernel和系统开机的总体流程
介绍BootLoader、PM、kernel和系统开机的总体流程
|
存储 运维 数据中心
Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
Docker是容器化技术,基于镜像(只读模板)创建可移植的容器,确保应用及其服务在隔离环境中运行。其优势包括快速部署(整个应用打包一次部署)、跨平台兼容、统一运行环境、资源隔离和简化依赖管理。Docker在开发和运维中都发挥作用,助力高效测试、部署和提升生产稳定性。
278 3
|
SQL 存储 NoSQL
数据库基础学习思路
数据库设计是根据用户的需求,在某一具体的数据库管理系统上,设计数据库的结构和建立数据库的过程。设计过程中需要遵循一些原则,如一对一设计、独特命名、双向使用等,以减少数据冗杂,维护数据一致性。
336 2
|
JavaScript Java 测试技术
基于微信小程序的微信平台签到系统的设计与实现(源码+lw+部署文档+讲解等)
基于微信小程序的微信平台签到系统的设计与实现(源码+lw+部署文档+讲解等)
244 0

热门文章

最新文章