1. 程式人生 > >有關陣列去除重複的leetcode題

有關陣列去除重複的leetcode題

有關陣列的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; 
            }
         }

}