代码随想录 Day 8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

ray.tune调参学习笔记0:调参基本流程 本篇总结python中使用tune调参的整体流程 阅读详情

一、344.反转字符串

建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数

题目链接/文章讲解/视频讲解:代码随想录

1. 看到这道题的第一想法

        因为题目要求时间复杂度为O(1),不可以另外申请空间,所以直接调用reverse()函数。

        已AC的代码如下:

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        return s.reverse()

2. 看完代码随想录的想法

        使用双指针法,首先定义左指针和右指针分别指向字符串数组的头和尾;

        然后进入循环遍历,将左右指针同时向中间移动,直到两个指针指向同一个字符;

        接下来在循环遍历过程中,利用中间变量先存放左指针的元素,然后将右指针值传递给左指针,再将中间变量所存放的原左指针的值传递给右指针,这样就完成了两个元素的交换,每次交换完成后需要将左右指针向中间移动一位;

        最后返回交换完毕后的字符串数组。

class Solution:
    def reverseString(self, s: List[str]) -> None:
        left = 0
        right = len(s)-1

        while left < right:
            mid = s[left]
            s[left] = s[right]
            s[right]=mid
            left += 1
            right -= 1
        return s

二、541. 反转字符串II

建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。

题目链接/文章讲解/视频讲解:代码随想录

1. 看到这道题的第一想法

        首先题意理解模糊不清;其次想要使用双指针法来实现,但是题目条件过于冗杂,并且没有想到将字符串使用list()函数转化为数组形式处理;没有思考在调用反转函数时,是部分反转而不是整个数组进行反转,所以此处应该用到切片;在循环遍历时,应该将指针每次按2k的单位进行移动,并且range函数是左闭右开的,第三个位置可以设置步长,此处就设置为2k。

2. 看完代码随想录的想法

(1)首先在内层定义一个函数,命名为reverse_string,用于对字符串数组进行反转:

        使用双指针法,定义左指针和右指针,初始化存放于数组头和尾;然后以left < right为循环边界条件对数组进行遍历反转;首先定义一个中间遍量wrap,将左指针的值暂存wrap,然后将右指针的值赋值给左指针,然后将wrap存放的原左指针的值赋值给右指针,完成变量交换;接下来完成一次交换需要对左右指针进行更新,分别往中间移动一个单位;最后交换完成返回数组。

(2)对传入的字符串s进行类型转换,通过 list() 函数将它转换为数组类型nums_s。

(3)对数组进行切片循环遍历,设置指针i通过range()函数,[0, len(nums_s)),并且将循环步长设置为2*k;接下来调用上述定义的reverse_string函数对传入的切片数组[i:i+k]进行反转。

(4)拼接完成反转后的数组并返回。

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        # 定义一个反转函数,用于后续调用

        def reverse_string(nums):
            #定义左右指针用于反转数组
            left = 0
            right = len(nums)-1
            
            while left < right:
                wrap = nums[left]
                nums[left] = nums[right]
                nums[right] = wrap
                
                left += 1
                right -= 1

            return nums

        # 将字符串转换为数组形式,用于后续切片反转
        nums_s = list(s)

        for i in range(0, len(nums_s), 2k):
            nums_s[i:i+k] = reverse_string(nums_s[i:i+k])

        # 将切片并完成反转后的数组拼接起来,最终返回结果
        return ''.join(nums_s)

三、卡码网:54.替换数字

建议:对于线性数据结构,填充或者删除,后序处理会高效的多。好好体会一下。

题目链接/文章讲解:替换数字

1. 看到这道题的第一想法

        没有考虑到数组空间是固定的,要扩充内存需要将size进行增加

        以下代码未AC:

def reverseString(self, s: str) -> str:
    list_s = list(s)
    for i in range(len(list_s)):
        if list_s[i].isnumeric()==True:
            list_s[i] = 'number'
            
        size+=1
    return ''.join(list_s)

2. 看完代码随想录的想法

        如果想把这道题目做到极致,就不要只用额外的辅助空间了! (不过使用Java刷题的录友,一定要使用辅助空间,因为Java里的string不能修改)

        首先扩充数组到每个数字字符替换成 "number" 之后的大小。

        例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。

        如图:

        然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

 

        为什么要从后向前填充,从前向后填充不行么?

        从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素整体向后移动。

        其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。

        这么做有两个好处:

  1. 不用申请新数组。
  2. 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。

 

 

i.MX6ULL驱动开发 | 31 - Linux内核网络设备驱动框架 net_device结构体在内核中指代一个网络设备,定义在,是一个非常大的结构体,包含网络设备的属性描述和操作接口,其中一些关键的成员如下。Linux在轮询处理机制和中断处理机制的基础上,提出了一种高效的网络处理技术NAPI。NAPI的核心思想是不全部采用中断来读取网络数据,而是采用中断来唤醒数据接收服务程序,在接收服务程序中采用poll的方法来轮询处理数据。提高短数据包的接收效率,减少中断处理的时间。... 阅读详情

相关推荐

STM32G474串口调试避坑指南:从CubeMX配置到中断收发,手把手教你搞定USART1

本文详细解析了STM32G474串口调试中的常见问题,从CubeMX配置到中断收发,提供USART1的避坑指南。涵盖时钟树同步、GPIO模式选择、中断接收逻辑、波特率偏差修正等关键点,帮助开发者高效解决串口通讯难题,提升嵌入式开发效率。

weixin_29191081的博客 210

代码随想录Day8|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

今天的题目属于字符串比较基本的操作,也拓宽了双指针的应用场景。

sleepwhite的博客 840

用Verilog在FPGA上做个电子琴:从矩阵键盘到蜂鸣器的完整实现(附代码)

本文详细介绍了如何使用Verilog在FPGA上实现一个完整的电子琴系统,涵盖矩阵键盘扫描、音调生成和蜂鸣器驱动等核心模块。通过模块化设计和PWM调制技术,开发者可以构建一个可交互的音乐播放器,项目代码完整且易于扩展,适合FPGA初学者和数字逻辑设计爱好者实践。

weixin_29191669的博客 403

【代码随想录day8】【C++复健】 344.反转字符串 ;541. 反转字符串II;卡码网:54.替换数字

344.反转字符串秒了。看解析发现可以用swap,用法也很简单,直接swap(s[i],s[j]);,传入两个变量即可。虽然没省几行代码,不过记一下也是不错的。

yumenohimiko的博客 1120

【Unity3D优化】优化内置shader的内存占用

在打AB包的过程中,并不会把这些Built-in的shader单独打包,并与材质球和预设体做好依赖,因此打AB包时,Unity会自行在材质球和预制体的AB包内每一个都包含进去用到的Built-in的Shader,而且运行时,由于加载的是不同的AB包,shader也是不同的实例,占用的也是多份内存。结合项目特点可以分析,由于项目里使用了大量的粒子特效,一些特殊的效果,会给特效师写定制的shader,但是这些常见的效果,特效师直接使用了Unity Built-in的shader。继续优化内存占用。

a310989583的专栏 2312

Echarts之风力风速玫瑰图

风力风速玫瑰图前言改进之路代码如下总结导出与导入 前言 今天上班收到任务,我们老大让我研究一下这个“风速风向玫瑰图”,还说这个是百度的雷达图的变异体,于是乎我直接找的雷达图,但是雷达图没有这种柱形的,都是点线,然后我又找了好久,最后突然在echarts官网上面看到了图1-2,才终于有了思路,原来这个图不是雷达图的变异体,而是极坐标系下的堆叠柱状图,于是就开始我的“改进”之路了。 图1-1 改进之路...

qq_38776605的博客 1万+

Studying-代码随想录训练营day8| 344.反转字符串、541.反转字符串II、卡码网:54.替换数字

344.反转字符串、541.反转字符串II、卡码网:54.替换数字

yachihaoteng的博客 1054

Arxml文件可视化:当汽车软件架构遇见交互式设计工具

本文探讨了Arxml文件在汽车电子系统开发中的可视化技术,结合AUTOSAR架构标准,介绍了如何利用现代Web技术构建交互式设计工具。通过三维组件关系图、动态数据流展示和版本对比等功能,显著提升开发效率和架构评审质量,适用于MBD和ASPICE开发流程。

weixin_29050271的博客 427

代码随想录训练营Day8 | 344.反转字符串 | 541. 反转字符串II | 卡码网:54.替换数字

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。串和数组有什么差别,字符串是若干字符组成的有限序列,也可以理解为是一个字符数组,但是很多语言对字符串做了特殊的规定,接下来我来说一说C/C++中的字符串。例如 字符串 "a5b" 的长度为3,那么 将 数字字符变成字符串 "number" 之后的字符串为 "anumberb" 长度为 8。然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。

m0_68965961的博客 986

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

AutoSAR系列讲解(入门篇)1.2-AutoSAR概述

这里主要说明了AutoSAR是个什么,还有其工具链

雪云飞星的博客 5万+

代码随想录刷题day8丨344.反转字符串,541. 反转字符串II,卡码网:54.替换数字

文档讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html解题思路:双指针法。

m0_75195038的博客 951

STM32F103RCT6的FLASH读写操作

STM32F103RCT6是一款常用的32位微控制器,它具有内置的FLASH存储器,可以用于存储程序代码和数据。在本文中,我们将详细介绍如何进行STM32F103RCT6的FLASH读写操作,并提供相应的源代码。写入数据时,我们通过将数据直接写入FLASH地址来完成。通过使用适当的API和规则,我们可以有效地读取和写入数据。写入FLASH时,我们需要按特定的规则进行编程。首先,我们需要包含适当的头文件和定义相关的宏和变量,以便在代码中使用FLASH API。类型的指针,我们可以直接读取FLASH中的数据。

UplKubernetes的博客 1034

【代码随想录训练营第42期 Day8打卡 LeetCode 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

字符串的学习

记得要努力变强 1582

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串 II、卡码网:54.替换数字

代码随想录算法训练营day8 | 344.反转字符串、541.反转字符串 II、卡码网:54.替换数字

m0_55763458的博客 1448

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

代码随想录day8|344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

C 风格字符串是\0。如果你手动输入字符数组,并且没有显式地加\0,即使空间足够,\0,这会导致,并可能引发或。

qq_51776145的博客 735

代码随想录算法训练营Day8|字符串Part01| 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

本文总结了三个字符串处理问题及解法。1. 反转字符串(344):使用双指针原地交换字符数组元素,空间复杂度O(1),可通过中间变量或位运算实现交换。2. 反转字符串II(541):每2k字符反转前k个,剩余不足k则全反,使用StringBuilder处理字符串修改。3. 替换数字(54):将数字替换为"number",通过遍历字符判断处理。最后总结了String和StringBuilder的常用方法,强调StringBuilder适用于需要多次修改字符串的场景。

m0_71282417的博客 850

代码随想录day8 | leetcode344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

这行代码的目的是防止翻转区域越界,确保翻转操作的end索引不会超出字符数组的实际长度。通过Math.min,我们保证了翻转的范围始终在有效范围内。数组:是一个数据容器,可以存储同一类型的多个元素,长度是固定的,可变的。字符串:是一个特殊的对象,专门用于存储字符序列,具有丰富的操作方法,而且是不可变的。它们的共同点是都可以通过索引来访问元素,但在使用时,它们有不同的操作方式和功能。

2302_81139517的博客 1172

代码随想录训练营 Day8打卡 字符串part01 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

代码随想录训练营 Day8打卡 字符串part01 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

qq_42952637的博客 1257

Day8补代码随想录 字符串part1 344.反转字符串|541.反转字符串II|卡码网:54.替换数字

字符串和数组的区别?库函数reverse();普通函数:swap();(C++)语言,在JAVA中用临时变量手动实现交换逻辑。低级错误变量必须声明;返回类型是void的,并且是原地变换数组,不用设置返回值在for中如果声明for (int i=0,int j=length-1;i<length/2;i++,j–)是不对的,在for循环的初始化部分,如果要声明多个变量,不能重复写数据类型,只能声明一次数据类型。

爱因斯小柚的博客 838

代码随想录Day8:344.反转字符串,541.反转字符串II,卡码网54.替换数字,151.反转字符串中的单词,卡码网55.右旋字符串

在这个方法的基础上,判断需要补上空格的位置,即除第一个单词之外的每个单词的词首都需要补上空格;当快指针遍历到空格或串尾时,代表这个单词结束了,所以这个单词的最后一位字母下标是快指针-1;终止条件:左指针小于右指针(如果是奇数,相等的情况是只剩一个字母,不必交换)双指针,左指针从前向后遍历,右指针从后向前,交换左右指针所指的字母。慢指针指向快指针下一位(即空格的下一位,下一个单词的开头);如果少于k个字符,则全部翻转,其余情况都是翻转前k个。先将字符串整个反转,再将前k个反转,再将k-结尾反转。

weixin_44218597的博客 1116

代码随想录day8| 344.反转字符串 、 541. 反转字符串II 、 卡码网:54.替换数字

使用双指针(一个指向头,一个指向尾),交换两个字符,直到两个指针相遇或者相交。

m0_68516464的博客 437

代码随想录算法营Day8 | 344.反转字符串, 541. 反转字符串II, 卡码网:54.替换数字

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

cestyvwen的博客 445

代码随想录算法训练营Day8 | 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。先遍历旧的数组找数字个数,再根据数字个数创建新数组,创建两个指针一个扫描旧数组一个向新数组添加元素。编写一个函数,其作用是将输入的字符串反转过来。、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须。,从字符串开头算起,每计数至。

m0_74154872的博客 343

代码随想录Day8 | 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串

Day8

sRiddle的博客 1069

代码随想录Day8 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

思路:发现题目要求是以2k个为单位处理字符串的,当发现题目要求我们成段处理字符串时,要想到for循环里i也可以成段跳,即每次加2k。双指针法:头尾各有一个指针,指向要交换的位置,同时向中间移动收缩。,如果当前不是数字,直接赋值给。如果是数字,依次赋值。

m0_73617263的博客 297

零基础代码随想录【Day8】|| 344.反转字符串 , 541. 反转字符串II, 卡码网:54.替换数字 , 151.翻转字符串里的单词,卡码网:55.右旋转字符串

建议: 本题是字符串基础题目,就是考察 reverse 函数的实现,同时也明确一下 平时刷题什么时候用 库函数,什么时候 不用库函数。建议:这道题目基本把刚刚做过的字符串操作都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。然后从后向前替换数字字符,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。建议:本题又进阶了,自己先去独立做一做,然后在看题解,对代码技巧会有很深的体会。建议:对于线性数据结构,填充或者删除,后序处理会高效的多。卡码网:55.右旋转字符串。

Andrew______的博客 1002
上一篇: 代码随想录 Day 7 | 454.四数相加II、383. 赎金、15. 三数之和 、18. 四数之和
下一篇: 代码随想录 Day 9 | 151.翻转字符串里的单词、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串、字符串总结 、双指针回顾
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值