DEV Community

Ariston
Ariston

Posted on

算法篇

一、面试经典篇

1.合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

/*首先思路是双指针法,设置两个指针分别指向两个数组的末尾,对于nums1则是m-1,
然后比较两个指针所指元素的大小,其中大的放到m+n的位置,然后--,然后继续比较
*/
int p1 = 0, p2 = 0;  // 双指针初始化
while (p1 < size1 && p2 < size2) {
    if (条件1) {
        // 处理指针1所指元素
        p1++;
    } else if (条件2) {
        // 处理指针2所指元素
        p2++;
    } else {
        // 处理两个指针所指元素的关系
        p1++; p2++;
    }
}

// 处理剩余元素
while (p1 < size1) {
    // 复制或处理nums1[p1]的剩余部分
    p1++;
}

while (p2 < size2) {
    // 复制或处理nums2[p2]的剩余部分
    p2++;
}
//上述是处理双数组、双指针问题解题模板、其中后面连个while是如何处理剩余元素
Enter fullscreen mode Exit fullscreen mode

2.移除数组

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

/*
原地问题一般考虑双指针、快慢指针,快指针用于遍历,慢指针用于获取数组长度
*/

Enter fullscreen mode Exit fullscreen mode

Top comments (0)