代码随想录day8--字符串总结、双指针总结

字符串总结

什么是字符串

字符串是若干字符组成的有限序列,也可以理解位是一个字符数组,但是很多语言对字符串做了特殊的规定。

在C语言中,把一个字符串存入一个数组时,也把结束符'\0'存入了数组,并以此作为该字符串是否结束的标志。

在C++中,提供了一个string类,string类会提供size接口,可以用来判断string类字符串是否结束,就不需要用'\0'来判断是否结束

有些同学有疑问vector<char>和string有什么区别呢

其实在基本操作上没有什么区别,但是string提供更多的字符串主力的相关接口,例如string重载了+,而vector却没有。所以说,我们要处理字符串,我们还是会定义一个string类型。


是否要使用库函数

因为字符串中可以使用的库函数较多,所以很多同学习惯于调用substr(从一个字符串中提取指定位置和长度的子字符串)、split(将字符串分隔成包含子字符串的数组)、reverse(反转字符串)等库函数,我们当然可以使用,但是需要知道其具体如何实现,以及时间复杂度,否则,假设之后的面试中被问到如何实现又或者其时间复杂度是多少,就懵逼了。

所以建议,一道题目的关键部分可以直接用库函数解决,那么尽量自己动手写,而不是依靠库函数。如果库函数仅仅是解题过程中的一小部分,而且已经很清楚库函数的内部实现原理,可以考虑使用库函数。


字符串反转

单纯的字符串反转较容易理解和实现,所以在考察字符串反转的时候,会加上一些别的。

LeetCode541.反转字符串II中,题目中的:每隔2k个字符的前k的字符,写了比较复杂的代码进行处理,但是每当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章了。只要让i+=(2*k),i每次移动2k就可以了,然后判断是否有需要反转的区间。

LeetCode151.翻转字符串的单词中要求翻转字符串里的单词,这道题目综合考察了字符串的多种操作,这道题搞定了,字符串的基础操作就没有问题了。这道题需要先整体反转再对每个单词进行反转,从而可以实现反转字符串中的单词。


KMP

KMP的主要思想是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配。

KMP的精髓是前缀表。(前缀表:起始位置到小标i之前(包括i)的子串中,有多大长度的相同前缀后缀)

使用KMP可以解决两类经典的问题:

1.匹配问题:LeetCode28.实现strStr()

2.重复子串问题: LeetCode459.重复的子字符串

前缀:不包含最后一个字符的所有以第一个字符开头的连续子串

后缀:不包含第一个字符的所有以最后一个字符结尾的连续子串

再针对前缀报表到底要不要减一,这其实是不同KMP实现的方式。

KMP比较难以理解,我也只是简单的描述了一下,基础较为薄弱的同学再进行字符串的练习过程中,可以选择跳过这一部分,等算法能力提升了再进行学习。(我也不太懂,后续作者会持续更新)


双指针总结

数组篇

在代码随想录day1中,就提到了数组中的元素,不能真正的删除,只能被覆盖,但是如果使用暴力发进行求解LeetCode27.移除元素的时间复杂度是O(n^2)无法通过,这时候就可以使用双指针法进行求解。

双指针在效率上的优势:通过两个指针在一个for循环下完成两个for循环的工作。


字符串篇

LeetCode344.反转字符串中,使用双指针法,定义两个下标,一个在字符串起始位置,一个在字符串末尾位置,两个指针同时向中间移动,并且交换元素,时间复杂度是O(n)。

替换数字中,使用的是双指针填充字符串的方法,要把这道题做到极致,就不能使用额外的辅助空间。思路就是:先把数组扩充,然后使用双指针从后向前替换数字

LeetCode151.翻转字符串里的单词中,使用双指针法,根据题目要求删除多余的空格,使用O(n)的时间复杂度完成了字符串删除类的操作。

有很多同学在删除多余空格的过程中,习惯于使用erase函数,导致很容易写成O(n^2)的时间复杂度。但是使用双指针法,就可以仅用O(n)的时间复杂度就可以实现。具体实现过程,与移除元素过程一致,但是需要多加一步保持住单词间的空格。


链表篇

反转链表是一道很经典的题目,考察了链表以及指针的熟悉程度

LeetCode206反转链表中,使用双指针法反转链表,只需要改变链表next指针的指向,直接将链表反转,而不需要重新定义一个新的链表,代码与思路不是很难想到,需要同学们多次的理解练习。

在链表中求环,是双指针在链表中的最经典的英语,在LeetCode142.环形链表II中,我们学习了如何通过双指针判断是否有环。具体实现:

定义一个快指针一个慢指针,都从头结点出发,快指针每次移动两个结点,慢指针每次移动一个结点,如果快指针和慢指针在途中相遇,说明这个链表有环。


N数之和篇

我们之前学习过,可以使用哈希表解决两数之和的问题,但是也可以使用双指针法进行求解,只是题目中要求的是两元素的下标,无法使用双指针求解,如果题目改成求具体两个元素的数值就可以了。

虽然可以使用哈希法求解两数之和,但是哈希法并不适用于求解三数之和。因为使用哈希法的过程中要把符合条件的三元组放进vector中,然后再去重,这就非常费时,这就是为什么不使用双指针的原因。

这道题使用双指针法才是最合适的,通过前后两个指针不断向中间逼近,在一个for循环下完成两个for循环的工作。

同样的原理,四数之和,n数之和都是可以求解的

### 回答1: 《代码随想录知识星球精华-大厂面试八股文v1.1.pdf》是一份介绍八股文的面试指南,针对大厂面试常见题型进行分类,以及给出相应的解答思路。这份资料具有很高的参考价值,在为即将面试的求职者提供指引的同时,也可以让读者对八股文的思维框架和策略有更好的了解。 这份资料主要包括面试题目的主题分类,如动态规划、字符串、树等,每个分类下又相应给出了典型的问题,如“最长公共子序列”、“二叉树的层次遍历”等等。对于每个问题,都给出了具体的思路指导和代码模板,许多题目给出了多种不同的解法,这些解法包括时间复杂度和空间复杂度的优化。 这份资料对于求职者来说,意义重大。在面试中,对于某些问题我们可能没有完全解决,但如果有了这份资料,我们在面试中也会有一个清晰的思考框架和即时可用的代码模板。此外,这份资料同样适用于对算法和数据结构感兴趣的开发者和工程师,对于自学和提高都有帮助。 总之,《代码随想录知识星球精华-大厂面试八股文v1.1.pdf》是一个非常实用的参考材料,它是广大求职者和程序员不可或缺的工具,值得一读。 ### 回答2: 《代码随想录知识星球精华-大厂面试八股文v1.1.pdf》是一份由知名博主“代码随想”的知识星球推出的热门资料。该资料主要介绍了大厂面试中常见的八股文,包括但不限于动态规划、双指针、贪心算法、字符串操作等。 通过学习该资料,可以系统地学习和掌握各种常见的算法和数据结构,有助于提高自己的代码能力和面试竞争力。此外,资料还给出了一些实际的面试题目例子,对于准备去大厂面试的人来说,是一份非常实用的资料。 当然,要想真正掌握这些算法和数据结构,需要自己的不断练习和实践。只有在解决实际问题的过程中,才能真正体会到这些算法和数据结构的作用和优越性。 总之,该资料对于想要深入了解算法和数据结构、提高面试竞争力的人来说是一份值得推荐的优秀资料。 ### 回答3: 代码随想录知识星球精华-大厂面试八股文v1.1.pdf是一份关于大厂面试八股文的精华资料,它收集整理了各个大厂面试中常见的八股文题目和解题思路,对于准备求职或者升职的程序员来说是一份非常有价值的资料。 该资料中涵盖了常见的算法、数据结构、操作系统、计算机网络、数据库、设计模式等知识点,每个知识点都有详尽的讲解和相应的面试题目,可以帮助面试者全面了解每个知识点的考察方向和难点。 此外,该资料还提供了八股文的解题思路和解题方法,强调了实战经验和面试技巧,对于提高面试的成功率也是非常有帮助的。 总之,代码随想录知识星球精华-大厂面试八股文v1.1.pdf是一份非常实用的面试资料,它帮助面试者深入了解各个知识点的考察方向和难点,提高了应对面试的能力和成功率,对于准备求职或者升职的程序员来说是一份不可或缺的资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值