有关数组去除重复的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; 
            }
         }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Leetcode库是一个包含了各种算法和数据结构问的在线库,供程序员练习和提升技能使用。这个库中涵盖了大量的目,包括但不限于图遍历、最短路径、有效的括号、字符串解码、Z字形变换、最长公共前缀、字符串相乘、颠倒字符串中的单词、比较版本号、反转字符串、压缩字符串、验证IP地址等等。它提供了java实现的leetcode解法,这些解法的代码规范,可读性良好,并且其中的解法思想并不受语言限制。通过解决这些目,程序员可以提高自己的算法和编码能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [leetcode库-leetcode-java:LeetcodeJava代码](https://download.csdn.net/download/weixin_38661100/19901136)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [LeetCode算法整理(200左右)](https://blog.csdn.net/qq_38253797/article/details/126827454)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值