1、原地移除元素
数组原地移除元素,且空间复杂度为O(1) ,可以直接使用快慢指针
- 快慢指针都以0 开始增加
- 快指针直接递增,慢指针在nums[slow]!=nums[fast] 时递增,这样就可以保证慢指针的记录的值仅包含非目标值。
- 返回慢指针,可以看作返回长度为 slow的数组。
public int removeElement(int[] nums, int val) {
int slow = 0, fast;
for (fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
2、反转字符串中的单词
class Solution {
public String reverseWords(String s) {
//直接在字符串首位加空格,方便判断
s = " " + s;
int n = s.length();
StringBuilder sb = new StringBuilder();
int left, right;
//left 一直在往左边走
for (left = n - 1, right = n; left >= 0; left--) {
char ch = s.charAt(left);
//如果遇到空格
if (ch == ' ') {
//将截取的字符串加入到结果中
if (left + 1 < right) {
sb.append(s, left + 1, right).append(' ');
}
//移动右指针
right = left;
}
}
return sb.substring(0, sb.length() - 1);
}
}
3、环形链表
选取快慢指针,快指针走两步,慢指针走一步,如果有环,必定相遇 设链表非环部分长度为 a , 环中部分长度为 b ,f = 2s 且fast总比slow多走n个环,所以 f = s + nb 由上得:f = 2nb s = nb 此时将f 指向头节点,slow 与 fast 同时每轮向前走1 步 当 f 走到a 点时,s = nb+a 此时两指针重合,并指向入口
public ListNode detectCycle(ListNode head) {
ListNode slow = head, fast = slow;
while (slow.next != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (fast == slow) {
ListNode index1 = head;
ListNode index2 = fast;
while (index2 != index1) {
index2 = index2.next;
index1 = index1.next;
}
return index1;
}
}
return null;
}