与数组相关经典面试题

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑


141be48b096148618152a3aa576d9e5f.png

一:原地移除指定的元素值

题目:

09458c1c65c2418483e2bff9125d4247.png

思路讲解:

85aae976c48c4601b60fcb9eaa64966f.png

我们以此数组为例:

1:首先定义2个变量 n1,n2都分别指向第一个元素(注意n2的初始值必须指向首元素)

2:当 nums[n2] == val 向后移动n2一步

3:nums[n2] != val   则执行 nums[n1++] = nums[n2++] 也就是 n2对应指向的元素赋值给 n1

草图见下:

2491821c7f2d44cbb124f2dc4359069a.png

OJ代码实现

int removeElement(int* nums, int numsSize, int val)
 {
    //  int fast = 1,slow = 0; 注意这里fast必须初始值是0(可能存在第一个元素就为val)
   int n1 = 0,n2 = 0;
   while(fast<numsSize)
   {
       if(nums[n2] == val)
       {
           n2++;
       }
       else
       {
           nums[n1++] = nums[n2++];
       }

   }
return n1;
    
}

二:删除排序数组重复项

题目:

e8aa29f7bcfc4bd0ae0814e30fc398e2.png

思路讲解:

这里我们一人是双指针的玩法:

1:定义2个指针n1 = 0,n2 = 1  注意n1,n2只表示下标的含义

2:nums[n1] == nums[n2] ,此时n2++

直到 nums[n1] != nums[n2] 执行 nums[++n1] = nums[n2++]注意到底是先加加还是先用数值

草图见下:

 9e9aa4508b6d4bcd8f8aa20e306222d9.png

OJ代码实现

int removeDuplicates(int* nums, int numsSize)
 {
     int n1 = 0,n2 = 1;
     while(n2 < numsSize)
     {
         if( nums[n1] == nums[n2])
         {
             n2++;
         }
         else
         {
             nums[++n1] = nums[n2++];
         }
     }
    return n1+1;
}

三: 合并2个有序数组

题目:8ebe6f7fbc92429cab9c0dc58ac0ded2.png

思路讲解:

这里我们用三指针的玩法是最优解

1:定义三个变量 l:返回新数组的大小;l1:数组1的大小;l2:数组2的大小

2:借助尾插的思想,比较2个数组元素谁大,取大的进行尾插到数组1的末尾,依次循环

3:注意第一个循环判断条件必须是 逻辑且(不能是逻辑或):因为当有一个数组已经走完的时候剩下 的那个未走完的数组直接进行赋值拷贝即可

4:若是第2个数组先走完的,那么此时已经完成了数组的合并

5:若是第1个数组先走完的下面还需要对数组2 余下的内容进行赋值拷贝

草图见下:

 368c4307ecb5402ab3f6337fb541114d.png

OJ代码实现

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
 {
     /*
     借助尾插思想:从目标数组的最后一个位置开始进行:取2个数组中较大的元素尾插
     */
     int l= m+n-1,l1 = m-1,l2 = n-1;
     while(l1 >= 0 && l2 >= 0)
     {
         if(nums1[l1] >= nums2[l2])
         {
            nums1[l--] = nums1[l1--];
         }
         else
         {
             nums1[l--] = nums2[l2--];
         }
     }
     if(l1 < 0)
     {
        while(l2>= 0) 
        {
           nums1[l--] = nums2[l2--];  
        }
     }
    
}

结语:

以上就是今日为大家share 的内容。其实仔细看一下,发现这些题目还是有相似之处的。但是但是:做题的思路又有些出入,这时我们不妨静下心来好好复盘一下,看看是否有可以继续深挖的地方。

ok,接下来咱走起来,老铁你懂滴!

 

  • 35
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值