27. 移除元素

从数组nums中移除值为val的元素,并返回新数组元素
方法一:快慢指针,快指针用于跳过val元素。
方法二:双向指针,左指针用于寻找等于val的元素,右指针用于寻找不等于val的元素,寻找到后将右指针元素值覆盖左指针元素

344. 反转字符串

双向指针,交换头尾元素

剑指 Offer 05. 替换空格

  1. 统计空格个数,将原字符串resize到添加%20后的大小
  2. 双指针分别指向resize前后字符串末尾
  3. 从后向前遍历,碰到空格就添加%20

因为从前往后添加元素的时候要将原本的元素全部后移,时间复杂度太高,从后往前能通过覆盖

151. 颠倒字符串中的单词

resize()的时候

  1. 去除字符串中多余的空格

    1. void removespace(string &s)
    2. {
    3. int slow = 0;
    4. for(int i=0;i<s.size();i++)
    5. {
    6. //去除空格,碰到空格就跳过
    7. if(s[i]!=' ')
    8. {
    9. //在单词后方补充上一个空格
    10. if(slow>0)s[slow++]=' ';
    11. //复制不是空格的字符(跳出循环时,代表复制完一个单词)
    12. while(i<s.size()&&s[i]!=' ')
    13. s[slow++]=s[i++];
    14. }
    15. }
    16. s.resize(slow);
    17. }
  2. 将整个字符串翻转

  3. 将单词翻转

    206. 反转链表

    双指针
    cur指向head,pre指向NULL,先保存temp=cur->next,再将cur->next指向pre,pre=cur,cur=temp

    19. 删除链表的倒数第 N 个结点

    虚拟节点 dummyHead
    快慢指针,使用双指针形成间隔n的两个指针。
    先让快指针移动n步,然后快慢指针同时移动,直至快指针指向NULL,此时慢指针指向倒数第n个结点。
    为了删除n个结点,需要让慢指针指向第n个结点的前一个结点,所以先让快指针移动n+1步

    面试题 02.07. 链表相交

    方法一:哈比表(哈希集合)先将一个链表的结点添加至哈希表中,然后在看另一个链表的值是否在哈比表中,找到第一个在哈希表中的结点。
    方法二:快慢指针
    首先遍历自己链表,遍历至NULL后指向另一个链表的头结点遍历

    142. 环形链表 II

    法一:快慢指针,

  4. 快指针每次移动两步,慢指针每次移动一步,如何两个指针相遇,则说明链表存在环

  5. 重新将慢指针指向链表的头结点,快指针指向相遇结点,快慢指针每次移动一步,
  6. 当快慢指针再次相遇是就是环形的入口节点

法二:哈希表

15. 三数之和

先将数组排序,固定第一个数i,在将左指针指向i+1,右指针指向size-1,然后判断三数之和与目标值的大小,若小于目标值,则左指针右移,若大于目标值,右指针左移,若相等,则记录数字。