
🌈个人主页:聆风吟_
🔥系列专栏:数据结构手札・刷题篇
🔖少年有梦不应止于心动,更要付诸行动。
文章目录
- 📚专栏订阅推荐
- [一. ⛳️合并两个有序数组](#一. ⛳️合并两个有序数组)
-
- [1.1 题目](#1.1 题目)
- [1.2 示例](#1.2 示例)
- [1.3 限制](#1.3 限制)
- [1.4 解题思路](#1.4 解题思路)
- [二. ⛳️训练计划 I](#二. ⛳️训练计划 I)
- 📝结语
📚专栏订阅推荐
| 专栏名称 | 专栏简介 |
|---|---|
| C++藏宝阁 | 本专栏聚焦学习阶段核心知识点,深耕基础与实战,干货笔记持续更新,和大家共学共进,夯实编程功底。 |
| 数据结构手札 | 本专栏主要是我的数据结构入门学习手札,记录个人从基础到进阶的学习总结。 |
| 数据结构手札・刷题篇 | 本专栏是《数据结构手札》配套习题讲解,通过练习相关题目加深对算法理解。 |
一. ⛳️合并两个有序数组
1.1 题目
给你两个按非递减顺序 排列的整数数组nums1和nums2,另有两个整数 m 和 n ,分别表示nums1和nums2中的元素数目。请你合并 nums2 到nums1中,使合并后的数组同样按非递减顺序排列。
注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。
1.2 示例
输入: nums1 = [ 1, 2, 3, 0, 0, 0 ], m = 3, nums2 = [ 2, 5, 6 ], n = 3
输出: [ 1, 2, 2, 3, 5, 6 ]
1.3 限制
- nums1.length == m + n
- nums2.length == n
- 0 <= m, n <= 200
- 1 <= m + n <= 200
- -109 <= nums1[i], nums2[j] <= 109
1.4 解题思路
双指针
1.初始化: 定义三个指针end1,end,end2分别指向数组num1的有效元素的位置、以及num1和num2的最后位置。
2.循环:
- 如果nums1[end1] > nums2[end2],执行
nums1[end--] = nums2[end2--]; - 如果nums1[end1] <= nums2[end2],执行
nums1[end--] = nums1[end1--]; - 如果end1 或 end2 其中一个小于0,循环终止。
3.判断end2是否小于零:
- 如果为小于零,不进行任何操作;
- 如果大于等于零,将nums2中的剩余的元素压入nums1中。

c语言代码:
c
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
//初始化
int end = m + n -1;
int end1 = m -1;
int end2 = n - 1;
//循环
while(end1 >= 0 && end2 >= 0)
{
if(nums1[end1] > nums2[end2])
{
nums1[end--] = nums1[end1--];
}
else
{
nums1[end--] = nums2[end2--];
}
}
//判断end2的值
while(end2 >= 0)
{
nums1[end--] = nums2[end2--];
}
}
二. ⛳️训练计划 I
2.1 题目
教练使用整数数组 actions 记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组 形式返回。
2.2 示例
输入: actions = [ 1, 2, 3, 4, 5 ]
输出: [ 1, 3, 5, 2, 4 ]
解释: 正确答案不为一
2.3 限制
- 0 <= actions.length <= 50000
- 0 <= actions[i] <= 10000
2.4 解题思路
采用双指针
定义双指针 left 和 right 分别位于数组的两端,循环执行:
- 指针
left从左向右寻找偶数; - 指针
right从右向左寻找奇数; - 将指针
left找到的偶数与指针right找到的奇数进行交换。

c语言代码:
c
// 交换函数
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int* trainingPlan(int* actions, int actionsSize, int* returnSize) {
int l = 0; // 左指针
int r = actionsSize - 1; // 右指针
while (l < r)
{
while (l < r && actions[l] % 2 != 0)
l++; // 从左向右找首个偶数
while (l < r && actions[r] % 2 == 0)
r--; // 从右向左找首个奇数
swap(&actions[l], &actions[r]); // 交换
}
// 设置返回数组长度
*returnSize = actionsSize;
return actions;
}
c++代码:
cpp
class Solution {
public:
vector<int> trainingPlan(vector<int>& actions) {
int sz = actions.size();
int l = 0;//左指针
int r = sz -1;//右指针
while(l < r){
while(l < r && actions[l] % 2 != 0) l++;//从左向右找首个偶数
while(l < r && actions[r] % 2 == 0) r--;//从右向左找首个奇数
swap(actions[l], actions[r]);//交换
}
return actions;
}
};
📝结语
今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟_的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
