与数组相关经典面试题

!!‧✧̣̥̇‧✦‧✧̣̥̇‧✦ ‧✧̣̥̇:Solitary-walk

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

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

 


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

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


与数组相关经典面试题_第1张图片

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

题目:

与数组相关经典面试题_第2张图片

思路讲解:

与数组相关经典面试题_第3张图片

我们以此数组为例:

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

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

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

草图见下:

与数组相关经典面试题_第4张图片

OJ代码实现

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

二:删除排序数组重复项

题目:

与数组相关经典面试题_第5张图片

思路讲解:

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

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

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

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

草图见下:

 与数组相关经典面试题_第6张图片

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个有序数组

题目:与数组相关经典面试题_第7张图片

思路讲解:

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

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

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

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

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

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

草图见下:

 与数组相关经典面试题_第8张图片

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,接下来咱走起来,老铁你懂滴!

 

你可能感兴趣的:(算法,c语言,c++,数据结构,后端,架构)