字符串:
库函数:
对于库函数的应用,打基础的时候不要太迷恋库函数,因为之前复习代码题,我反而是第一时间不太会想到库函数,即使在比较长的代码中split,reverse之类的库函数也是再写了一遍,虽然更强调的是要了解基础,但对于我来说了解一下这些常用的库函数也是有必要的
双指针法:
虽然也做了几道题,但是第一时间还是想到的暴力,然后看到题解说双指针才会再去想,或者之前做过的双指针题,再看到才会想起来,积累也是一部分吧,双指针法在数组,链表和字符串中很常用。要明确两个指针各自的作用,除了暴力再多想下双指针,用双指针用一个for循环完成之前两个for循环做的事。
想一想:344反转字符串
27移除元素
151反转字符串里的单词 中双指针的作用
反转:
反转的思路 ,感觉多做几道题还是有点想法的,举个例子比划几下很明显
比如,整体反转,局部反转
当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章。
双指针:
数组:
原地移除数组中的元素,数组中的移除是通过覆盖的方式用两个for循环,想一想两个For循环能不能用一个呢。这就是双指针的方法,一个指针用来寻找放在新数组中的元素,另一个指针负责这个元素要放在新数组的什么位置
所以此时使用双指针法才展现出效率的优势:通过两个指针在一个for循环下完成两个for循环的工作。
字符串:
卡码网把数字替换成number这道题,在不使用额外空间下
思路就是首先扩充数组。然后双指针从后向前替换空格。
有同学问了,为什么要从后向前填充,从前向后填充不行么?
从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。
其实很多数组(字符串)填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
在删除冗余空格的过程中,如果不注意代码效率,很容易写成了O(n^2)的时间复杂度。其实使用双指针法O(n)就可以搞定。
链表:
链表的题,一定要画图,搞清指针的指向
还有多做题吧,这块题好多,像是判断链表有没有环,还有相交链表,都是由于之前做过,思路就有了,然后就是代码的细节了,不然我一开始根本想不到
反转链表(不用库函数)
在链表中求环(判断有没有环(快指针一次走两步,慢指针一次走一步,相遇就是有环),
(环的起点在哪(难,画图 整理式子 寻找关系))
N个数之和:
这种题,刚开始做是每道都卡啊
两数之和,可以双指针可以哈希表
三数之和:使用哈希法不容易去重,使用双指针,for循环遍历,两个指针找另外两个数指针如何移动呢,别忘记先排序!!从小到大排序后,通过和与目标值的大小来移动
四数值和:在三数之和的外层又套了个for循环。这两个难点都是去重
这些天做的使用双指针解决问题的经典题目,除了链表一些题目一定要使用双指针,其他题目都是使用双指针来提高效率,一般是将O(n^2)的时间复杂度,降为$O(n)$。