<?php //监控变化 $nums = [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]; remove_dup_check_change($nums); print_r($nums); function remove_dup_check_change(&$nums) { if (empty($nums)) { return 0; } $tmp = null; foreach ($nums as $i => $num) { //当元素与tmp不一致时,说明到达变化点,即将进入下一组 if ($num !== $tmp) { $tmp = $num; //当元素与tmp一致时,说明仍在同一组 } else if ($num === $tmp) { unset($nums[$i]); } } return count($nums); } //快慢指针 $nums = [1, 1, 1, 2, 2]; remove_dup_fast_slow($nums); print_r($nums); function remove_dup_fast_slow(&$nums) { if (empty($nums)) { return 0; } $len = count($nums); for ($slow = 0; $slow < $len; ) { $fast = $slow + 1; //快指针与慢指针指向元素相同,依次删除快指针指向元素 while (isset($nums[$fast]) && $nums[$fast] === $nums[$slow]) { unset($nums[$fast]); $fast++; } $slow = $fast; } return count($nums); }