专业网站建设包括哪些新app推广方案
练习一:合并两个有序数组
1. 题目
2. 思路
- 将遍历后的数组存储在临时数组sorted中;
- 使用双指针 p1、p2同时遍历两个数组;
- 当p1等于nums1的size时,p1排序完成,从nums2中取元素;
- 当p2等于nums2的size时,p2排序完成,从nums1中取元素;
- 当p1、p2没遍历完,就比较两个数的大小,取较小的数;
- 将当前比较出的最小值放入sorted数组的当前位置,并递增index
- 将sorted拷贝到num1并复制数组
3. 代码
#include <vector>class Solution
{
public:void merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n) {int p1 = 0, p2 = 0; // 双指针分别指向两个数组的起始位置std::vector<int> sorted; // 存储排序完成后的数组sorted.resize(m + n); // 调整sorted的大小以容纳m+n个元素int cur; // 存储当前比较出的值int index = 0; // 新增索引用于记录sorted的位置// 遍历两个数组并排序while (p1 < m || p2 < n){// 当 p1 == m 时,nums1的所有元素已经处理完毕,从nums2中取元素if (p1 == m)cur = nums2[p2++]; // 取nums2中的当前元素,并移动p2指针// 当 p2 == n 时,nums2的所有元素已经处理完毕,从nums1中取元素else if (p2 == n)cur = nums1[p1++]; // 取nums1中的当前元素,并移动p1指针// p1、p2都没遍历完,就比较两个数的大小else if (nums1[p1] < nums2[p2])cur = nums1[p1++]; // 如果nums1的当前元素较小,则取nums1的当前元素,并移动p1指针else cur = nums2[p2++]; // 否则取nums2的当前元素,并移动p2指针sorted[index++] = cur; // 将当前比较出的最小值放入sorted数组的当前位置,并递增index}// 将sorted拷贝到num1for (int i = 0; i < m + n; ++i){nums1[i] = sorted[i]; // 将sorted数组中的每个元素复制到nums1中}
4. 错误总结
- 忘记包含头文件
- vector中部分函数使用方法不熟悉,需要复习
练习2:移除元素
1. 题目
2. 思路
初始化:
- 获取原数组
nums
的大小size
。 - 创建一个与原数组大小相同的临时数组
erased
,用于存储不等于val
的元素。 - 初始化一个计数器
k
,用于记录新数组的有效长度。
遍历原数组:
- 使用一个循环遍历原数组
nums
中的每一个元素。 - 对于每个元素,检查其是否等于
val
。
条件判断:
- 如果当前元素不等于
val
,将其赋值给临时数组erased
中的第k
个位置,并将k
增加 1。 - 如果当前元素等于
val
,则跳过该元素,继续下一个元素的检查。
替换原数组:
- 使用
swap
方法将原数组nums
的内容替换为临时数组erased
的内容。
返回结果:
- 返回计数器
k
的值,表示移除后的数组的新长度。
3. 代码
#include <vector>class Solution
{
public:int removeElement(std::vector<int>& nums, int val) {int slow = 0; // 慢指针,指向新数组的末尾位置for (int fast = 0; fast < nums.size(); ++fast) // 快指针,遍历原数组{if (nums[fast] != val) // 如果当前元素不等于目标值val{nums[slow] = nums[fast]; // 将当前元素放到慢指针的位置++slow; // 增加慢指针的位置}}return slow; // 返回新数组的有效长度}
};
4. 错误总结
- 一次过
练习3:删除有序数组的重复项
1. 题目
2. 思路
-
初始化:
- 首先检查数组是否为空。如果为空,直接返回 0。
- 使用一个慢指针
j
,初始值为 0,用于记录新数组的末尾位置。
-
遍历数组:
- 使用一个快指针
i
,从 0 开始遍历数组nums
。
- 使用一个快指针
-
条件判断:
- 对于每个元素
nums[i]
,检查其是否与nums[j]
相等。 - 如果
nums[i]
不等于nums[j]
,说明遇到了一个新的唯一元素: - 将
nums[i]
赋值给nums[j+1]
,并将慢指针j
增加 1。 - 如果
nums[i]
等于nums[j]
,则跳过该元素,继续下一个元素的检查。
- 对于每个元素
-
返回结果:
- 最终
j + 1
的值即为移除后的数组的新长度。
- 最终
3. 代码
#include <vector>class Solution
{
public:int removeDuplicates(std::vector<int>& nums) {if (nums.empty()) return 0; // 如果数组为空,直接返回0int j = 0; // 慢指针,指向新数组的末尾位置for (int i = 0; i < nums.size(); ++i) // 快指针,遍历原数组{if (nums[i] != nums[j]) // 如果当前元素不等于慢指针所指的元素{nums[++j] = nums[i]; // 将当前元素放到慢指针的下一个位置,并移动慢指针}}return j + 1; // 返回新数组的有效长度}
};
4. 错误总结
- 一次过