第一种方式:改变数组结构
<?php header("content-type:text/html;charset=utf-8"); /* *数组中重复的数字 P39 */ function duplicate($numbers,&$duplication){ //这里要特别注意~找到任意重复的一个值并赋值到duplication[0] //函数返回True/False if($numbers == null){ return false; } for($i = 0;$i<count($numbers);$i++){ while ($numbers[$i] != $i){ if($numbers[$i] == $numbers[$numbers[$i]]){ $duplication[0] = $numbers[$i]; return true; } swap($numbers,$i,$numbers[$i]);//把交换放在审核是否相等后面 } } return false; } function swap(&$arr,$i,$j){ $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } $arr = array(2,2,3,0,4); duplicate($arr,$a); print_r($a);
第二种方式:不改变数组结构
<?php header("content-type:text/html;charset=utf-8"); /* *数组中重复的数字(不打乱数组顺序) P41 */ function getDuplicate($numbers){ if($numbers == null){ return false; } $start = 1; $end = count($numbers)-1; while ($end >= $start){ $mid = (($start + $end) >> 2) + $start; $count = getCount($numbers,$start,$mid); if($start == $end){ if($count >1){ return $start; } else{ break; //没有重复的值,退出循环 } } if($count > $mid - $start +1){ $end = $mid ; } else{ $start = $mid +1; } } return false; } function getCount($numbers,$start,$end){ if($numbers == null){ return false; } $count = 0; for($i=0;$i<count($numbers)-1;$i++){ if($numbers[$i] >= $start && $numbers[$i] <= $end){ $count ++; } } return $count; } $arr = array(1,3,5,4,3,2,6,7); echo getDuplicate($arr);