与数组相关经典面试题

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

⸝⋆ ━━━┓

  • 个性标签 - :来于"云"的"羽球人"。 Talk is cheap. Show me the code

┗━━━━━━━ ➴ ⷯ

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

👑💎💎👑💎💎👑

💎💎💎自💎💎💎

💎💎💎信💎💎💎

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

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

👑👑👑💎👑👑👑


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

题目:
思路讲解:

我们以此数组为例:

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

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

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

草图见下:

OJ代码实现
cpp 复制代码
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;
    
}

二:删除排序数组重复项

题目:
思路讲解:

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

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

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

直到 nums[n1] != nums[n2] 执行**nums[++n1] = nums[n2++]**注意到底是先加加还是先用数值
草图见下:

OJ代码实现
cpp 复制代码
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个有序数组

题目:
思路讲解:

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

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

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

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

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

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

OJ代码实现
cpp 复制代码
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,接下来咱走起来,老铁你懂滴!

相关推荐
Chris _data3 分钟前
二叉树oj题解析
java·数据结构
დ旧言~15 分钟前
【高阶数据结构】图论
算法·深度优先·广度优先·宽度优先·推荐算法
时光の尘15 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
paopaokaka_luck17 分钟前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
我们的五年20 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
张彦峰ZYF20 分钟前
投资策略规划最优决策分析
分布式·算法·金融
-一杯为品-25 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
The_Ticker35 分钟前
CFD平台如何接入实时行情源
java·大数据·数据库·人工智能·算法·区块链·软件工程
程序猿阿伟36 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
Lenyiin1 小时前
02.06、回文链表
数据结构·leetcode·链表