27. 移除元素
从数组nums中移除值为val的元素,并返回新数组元素
方法一:快慢指针,快指针用于跳过val元素。
方法二:双向指针,左指针用于寻找等于val的元素,右指针用于寻找不等于val的元素,寻找到后将右指针元素值覆盖左指针元素
344. 反转字符串
剑指 Offer 05. 替换空格
- 统计空格个数,将原字符串resize到添加%20后的大小
- 双指针分别指向resize前后字符串末尾
- 从后向前遍历,碰到空格就添加%20
因为从前往后添加元素的时候要将原本的元素全部后移,时间复杂度太高,从后往前能通过覆盖
151. 颠倒字符串中的单词
resize()的时候
去除字符串中多余的空格
void removespace(string &s)
{
int slow = 0;
for(int i=0;i<s.size();i++)
{
//去除空格,碰到空格就跳过
if(s[i]!=' ')
{
//在单词后方补充上一个空格
if(slow>0)s[slow++]=' ';
//复制不是空格的字符(跳出循环时,代表复制完一个单词)
while(i<s.size()&&s[i]!=' ')
s[slow++]=s[i++];
}
}
s.resize(slow);
}
将整个字符串翻转
-
206. 反转链表
双指针
cur指向head,pre指向NULL,先保存temp=cur->next,再将cur->next指向pre,pre=cur,cur=temp19. 删除链表的倒数第 N 个结点
虚拟节点 dummyHead
快慢指针,使用双指针形成间隔n的两个指针。
先让快指针移动n步,然后快慢指针同时移动,直至快指针指向NULL,此时慢指针指向倒数第n个结点。
为了删除n个结点,需要让慢指针指向第n个结点的前一个结点,所以先让快指针移动n+1步面试题 02.07. 链表相交
方法一:哈比表(哈希集合)先将一个链表的结点添加至哈希表中,然后在看另一个链表的值是否在哈比表中,找到第一个在哈希表中的结点。
方法二:快慢指针
首先遍历自己链表,遍历至NULL后指向另一个链表的头结点遍历142. 环形链表 II
法一:快慢指针,
快指针每次移动两步,慢指针每次移动一步,如何两个指针相遇,则说明链表存在环
- 重新将慢指针指向链表的头结点,快指针指向相遇结点,快慢指针每次移动一步,
- 当快慢指针再次相遇是就是环形的入口节点
15. 三数之和
先将数组排序,固定第一个数i,在将左指针指向i+1,右指针指向size-1,然后判断三数之和与目标值的大小,若小于目标值,则左指针右移,若大于目标值,右指针左移,若相等,则记录数字。