有关数组的leetcode
2.1.1 Remove Duplicates from Sorted Array
描述
Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
For example, Given input array A = [1,1,2],
Your function should return length = 2, and A is now [1,2].
function f(&$arr)
{
if(false===is_array($arr)||empty($arr)) return 0;
$prev=null;
$num=0;
foreach($arr as $key=>$value){
if($prev==$value){
unset($arr[$key]);
}else{
$prev=$value;
$num++;
}
}
$arr=array_values($arr);//重建索引
return $num;
}
2.1.2 Remove Duplicates from Sorted Array II
描述
Follow up for ”Remove Duplicates”: What if duplicates are allowed at most twice?
For example, Given sorted array A = [1,1,1,2,2,3],
Your function should return length = 5, and A is now [1,1,2,2,3]
function f2(&$arr,$DumTime)
{
if(empty($arr)) return 0;
if(count($arr)<=$DumTime) return $DumTime;
$dumNum=0;
$num=0;
$prev=null;
foreach($arr as $key=>$value){
$num++;
if($value==$prev){
$dumNum++;
if($dumNum>=$DumTime){
unset($arr[$key]);
$num--;
}
}else{
$dumNum=0;
$prev=$value;
}
}
$arr=array_values($arr);
return $num;
}
**这2个题,因为采用了php专有的函数,unset()销毁变量
在c/c++中不存在这个函数,题目要求不再开辟新的空间,
因该这样做,但是最后数组的长度变小了。之后的部分多余了。
主要点在于记录不同的个数num以及数组的不重复的值的下标
function f(&$arr)
{
if(empty($arr)) return 0;
$index=0;
$num=0;
$couNum=count($arr);
for($i=1;i<$couNum;$i++){
if($arr[$index]!=$arr[$i]){
$arr[++$index]=$arr[$i];
$num++;
}
}
$num++;
array_splice($arr,$num); //去掉$num后的一部分
return $num;
}
function f2(&$arr,$DumTime)
{
if(empty($arr)) return 0;
if(count($arr)<=$DumTime) return $DumTime;
$dumNum=0;
$num=0;
$prev=0;
$countNum=count($arr);
for($i=1;$i<$countNum;$i++){
if($arr[$i]==$arr[$prev]){
$dumNum++;
if($dumNum<$DumTime){
$num++;
$arr[++$prev]=$arr[$i];
}
}else{
$num++;
$dumNum=0;
$arr[++$prev]=$arr[$i];
}
}
$num++;//这个$num的个数很重要
array_splice($arr,$num);
return $num;
}
**另外去除重复的
例如array(1,2,3,3)结果 array(1,2).length=2;**
function f(&$arr)
{
if(false===is_array($arr)||empty($arr)) return false;
$prev=0;
$isSame=false;
$countNum=count($arr);
for($i=1;$i<$countNum;$i++){
if($i!=$prev&&$arr[$i]==$arr[$prev]){
unset($arr[$i]);
$isSame=true;
}else if($isSame){
unset($arr[$prev]);
$isSame=false;
$prev=$i;
}
}//end for
if($isSame)
unset($arr[$prev]);
return count($arr);
}
function f6(&$arr)
{
if(false===is_array($arr)||empty($arr)) return false;
$prev=0;
$index=0;
$isSame=false;
$countNum=count($arr);
for($i=0;$i<$countNum;$i++){
if($prev==$i)
continue;
if($arr[$i]==$arr[$prev]){
$isSame=true;
}else if($isSame){
$isSame=false;
$prev=$i;
}else if($arr[$i]!=$arr[$prev]&&false===$isSame){
$arr[$index]=$arr[$prev];
$index++;
$prev=$i;
}
}//end for
if(false===$isSame){
$arr[$index]=$arr[$countNum-1];
$index++;
}
array_splice($arr,$index);
return $index;
}
数组只有一个元素不重复,其他均重复2次,求不重复的那个
function nDup($arr)
{
if(false===is_array($arr) return false;
$target=0;
foreach($arr as $value){
$target^=$value;
}
return $target;
}
数组只有2个元素不重复,其他均重复2次,求不重复的那个2个
function nDup2($arr)
{
if(false===is_array($arr)||count($arr)<4) return false;
$target=0;
foreach($arr as $value){
$target^=$value;
}
$brr=array();
$crr=array();
findZero($target,$arr,$brr,$crr);
$result[]=nDup($brr);
$result[]=nDup($crr);
return $result;
}
function findZero($target,$arr,&$brr,&$crr)
{
$a=1;
while(!($target&$a)){//注意有(),!优先级高
$a=$a<<1;//这样$a<<1;不对啊,要左值~
}
foreach($arr as $value){
if($a&$value){
$brr[]=$value;
}else{
$crr[]=$value;
}
}
}