应对笔试手写代码,如何准备数组相关问题?

Posted 执章学长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应对笔试手写代码,如何准备数组相关问题?相关的知识,希望对你有一定的参考价值。

1. 数组是个啥?

有一定编程语言基础对数组都不陌生,数组是存放在连续内存空间上的相同类型数据的集合。因此当我们通过索引去访问某个元素的时候,实际上是通过查找索引为0的元素的位置,然后加上索引值(偏移量)得到的。因此,按照索引查询一个数组的元素只需要 O(1) 的时间复杂度。但是删除和添加元素大概率需要移动大量元素,从而保证其连续存储空间的特点。

2. 数组题目常见类型

2.1. 二分查找

最朴素的二分查找(也就是中规中矩的二分查找)就是给你一个有序的数组,让你找到指定值的索引。如果是这道题那直接带入模板即可。
左闭右闭区间:

初始指针指向如上图,所以要保证在后续操作的过程中都要考虑[start,end]

class Solution 
    public int search(int[] nums, int target) 
        // 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
        if (target < nums[0] || target > nums[nums.length - 1]) 
            return -1;
        
        // 初始指针是指向左右两端,表示都是闭区间
        int left = 0, right = nums.length - 1;
        // 等号不能省略,因为当 left = right 时在闭区间中是有意义的,也就是有可能有答案的。
        while (left <= right) 
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
                right = mid - 1;
        
        return -1;
    

左闭右开区间:

初始指针指向如上图,所以要保证在后续操作的过程中都要考虑[start,end)

class Solution 
    public int search(int[] nums, int target) 
    	// 初始指针的右边要指向最后一个元素的下一个,表示这里没有意义,即开区间
        int left = 0, right = nums.length;
        // 等于号不用考虑,因为当 left = right 时,在[left,right)中,并没有意义。
        while (left < right) 
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target)
                return mid;
            else if (nums[mid] < target)
                left = mid + 1;
            else if (nums[mid] > target)
            // 注意这里不用加一,因为target的值是小于mid的值的,
            //所以,值在mid之前,但是是开区间,所以right = mid ,可以让right值得值是有效值的下一位。
                right = mid;
        
        return -1;
    

2.2. 指针类型

1、背向双指针(从中间某个点向两端移动)
典型题目:最长回文子串
典型题目:找到K个最接近的元素
2、面对面双指针(一个在左边,一个在右边,向中间靠拢)
典型题目:有序数组的平方
3、同向双指针(两个指针位于数组的左侧,最后移动到右侧)
这种类型又分为:滑动窗口类型和快慢指针类型,都是面试中的常客。
滑动窗口典型题目:长度最小的子数组
快慢指针典型题目:移除元素

ps:有时候也有三指针啥的,原理差不多

2.3. 模拟类型

螺旋矩阵II
没啥好说的,就是直接上题目。

2.4. 排序算法

常考的排序算法直接背诵模板。

以上是关于应对笔试手写代码,如何准备数组相关问题?的主要内容,如果未能解决你的问题,请参考以下文章

应对笔试手写代码,如何准备数组相关问题?

应对笔试手写代码,如何准备动态规划?

应对笔试手写代码,如何准备动态规划?

应对笔试手写代码,如何准备动态规划?

应对笔试手写代码,如何准备深度优先算法 & 广度优先算法?

应对笔试手写代码,如何准备深度优先算法 & 广度优先算法?