双指针题目总结
移除元素
- 是否有等于号(需要检查的时候要有;交换的时候可以没有)
- while循环里再有while还挺麻烦的(依旧要考虑外在循环),建议直接用if
- 注意索引和长度的关系。
反转字符串
记得left++;right–,不要形成死循环
替换数字
思路:从后往前填充数组
- 注意把变量写在for循环外边(Debug了好久!!!)
- str.charAt(i)是个方法,不要写成[]
int index = newchs.length - 1; // 一定注意写在外边
for(int i = str.length() - 1; i >= 0; i--){
if(Character.isDigit(str.charAt(i))){
newchs[index--] = 'r';
newchs[index--] = 'e';
newchs[index--] = 'b';
newchs[index--] = 'm';
newchs[index--] = 'u';
newchs[index--] = 'n';
}
反转字符串中的单词
- 去除首位和多余空格:不能在String上操作,转成StringBuffer。注意去除首位时要用循环不断缩小边界。
- 反转字符串:给出String/StringBuffer(StringBuffer可直接操作,String要转成字符串数组),返回值为Null即可
反转链表
给出两个指针,并在换方向之前记录下一个指针即可。
删除链表的倒数第N个结点
思路:关键是两个指针差n步
注意: 计算好是否有等于号
链表相交
- 当一个值不确定被赋予什么,使用三目表达式(eg:temp1 = temp1 != null ? temp1.next : headB;)
- 循环条件的判断放前还是放后
环形链表II
思路:找到两次相遇点
注意点:循环条件的判断:1. 不为空;2. 不相等(可以都在循环体内部写)
三数之和
思路:外循环+内循环(两个指针不断调整)
注意:while(index1 < index2){ // 注意何时有等于号,这里边如果有=,代表这个元素被加了两次
四树之和
思路:三个循环
注意:进行剪枝,taget注意复数;
总结
指针的作用:两个指针在一个for循环下完成两个for循环的工作
写博客的目的是每日督促并记录刷题,也欢迎大家批评指正~(day11)