面试题3:数组中重复的数字

NowCoder

第一种方式:改变数组结构

<?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);

 

posted @ 2018-12-02 17:53  小林子奋斗的点滴  阅读(151)  评论(0编辑  收藏  举报