剑指offer(PHP版改写)----数组部分

Posted cyworz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer(PHP版改写)----数组部分相关的知识,希望对你有一定的参考价值。

题目一:

  在一个长度为n的数组里的所有数字都在0~n-1的范围内。找出数组中任意一个重读数字。

/**
* 找出数组中的重复数字
* 长度为n的数组 所有数字在0~n-1的范围内
*
*
* @param $num 数组
* @param $length 数组长度
* @return bool
*/
function getNum($num,$length)
$mark = array();
if (count($num)==0||$length<=0)
return false;

for ($i=0;$i<$length;++$i)
if ($num[$i]<0||$num[$i]>$length-1)
return false;


for ($i=0;$i<$length;++$i)
while ($num[$i]!=$i)
if ($num[$i]==$num[$num[$i]])
$mark[] = $num[$i];
break;

$temp = $num[$i];
$num[$i]=$num[$temp];
$num[$temp]=$temp;


return $mark;


$a = [3,2,4,6,5,2,3,6];
print_r(getNum($a,count($a)));
题目二:不修改数组找出重复数字
在一个长度为n+1的数组里所有数字都在1~n的范围内,所以必有重复数字。找出任意一个重复数字,但不能修改数组。
/**
* 不改变数组 找出任意一个重复数字
* 二分法
* 时间换空间
* @param $number 数组
* @param $length 数组长度
*/
function getDuplication($number,$length)

if (count($number)==0||$length<=0)
return false;


$start = 1;
$end = $length-1;

while($end>=$start)
$middle = (($end-$start)>>1)+$start; //位运算 求中值
$count =countRange($number,$length,$start,$middle) ;
if ($end==$start)
if ($count>1)
return $start;
else
break;



if ($count>($middle-$start+1))
$end = $middle;
else
$start = $middle+1;




// return -1;


function countRange($num,$length,$start,$end)
if (count($num)==0)
return 0;


$count = 0;
for ($i = 0;$i<$length;$i++)
if ($num[$i]>=$start&&$num[$i]<=$end)
++$count;


return $count;


$a = [3,2,4,6,5,2,3,6];
print_r(getDuplication($a,count($a)));

以上是关于剑指offer(PHP版改写)----数组部分的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer:专项突破版》 - 数组部分 JavaScript 题解

《剑指Offer:专项突破版》 - 栈部分 JavaScript 题解

《剑指Offer:专项突破版》 - 哈希表部分 JavaScript 题解

《剑指Offer:专项突破版》 - 整数部分 JavaScript 题解

《剑指Offer:专项突破版》 - 链表部分 JavaScript 题解

剑指 Offer(第 2 版)完整题解笔记 & C++代码实现(LeetCode版)