🌈个人主页:聆风吟
🔥系列专栏:数据结构、算法模板
🔖少年有梦不应止于心动,更要付诸行动。
📋前言
💬 hello! 小伙伴们大家好哇,我们通过图文已经对顺序表进行了详细解析,相信小伙伴们已经对顺序表有的初步了解,今天我们在结合三道面试题对顺序表进一步巩固,如果有需要复习的小伙伴可以点击此处链接《图解顺序表》跳转过去对顺序表进行回顾。
📚 系列专栏:本期文章收录在《剑指offer每日一练》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!
🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝
一. ⛳️训练计划 I
题目:
教练使用整数数组 actions
记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组
形式返回。
示例:
输入: actions = [ 1, 2, 3, 4, 5 ]
输出: [ 1, 3, 5, 2, 4 ]
解释: 正确答案不为一
限制:
- 0 <= actions.length <= 50000
- 0 <= actions[i] <= 10000
解题思路:
采用双指针
定义双指针 left
和 right
分别位于数组的两端,循环执行:
- 指针
left
从左向右寻找偶数; - 指针
right
从右向左寻找奇数; - 将指针
left
找到的偶数与指针right
找到的奇数进行交换。
c++代码:
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;
}
};
二. ⛳️查找总价格为目标值的两个商品
题目:
购物车内的商品价格按照升序记录于数组 price
。请在购物车中找到两个商品的价格总和刚好是 target
。若存在多种情况,返回任一结果即可。
示例:
输入: price = [ 3, 4, 12, 15 ], target = 16
输出: [ 4, 12 ] 或者 [ 12, 4 ]
限制:
- 1 <= price.length <= 10^5
- 1 <= price[i] <= 10^6
- 1 <= target <= 2*10^6
解题思路:
采用双指针
定义双指针 left
和 right
分别位于数组的左右两端,循环执行(当指针相遇时,跳出):
- 计算sum = price[left] + price[right];
- 如果sum > target,则指针 right 向左移动,即执行
right--
; - 如果sum < target,则指针 left 向右移动,即执行
left++
; - 如果sum = target,则立即返回数组{ price[left],price[right] }
若循环结束,则返回空数组,代表无和为 target 的数字组合。
c++代码:
class Solution {
public:
vector<int> twoSum(vector<int>& price, int target) {
int sz = price.size();
int l = 0;//左指针
int r = sz - 1;//右指针
int sum = 0;
while(l < r){
sum = price[l] + price[r];
if(sum > target) r--;
else if(sum < target) l++;
else return {price[l], price[r]};
}
return {};
}
};
三. ⛳️删除有序数组中的重复项
题目:
给你一个 非严格递增排列 的数组nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
示例:
输入: nums = [ 1, 1, 2 ]
输出: 2, nums = [ 1, 2, _ ]
解释: 函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
限制:
- 1 <= nums.length <= 3 * 104
- -104 <= nums[i] <= 104
- nums 已按 非严格递增 排列
解题思路:
采用双指针
定义双指针 left
和 right
分别位于数组的下表为 0 和为 1 的位置,循环执行(当right走到数组末尾时停止):
- 如果
nums[left] != nums[right]
,执行nums[++left] = nums[right++]; - 如果
nums[left] == nums[right]
,执行right自增加1。
若循环结束,则返回right+1
即可。
c语言代码:
int removeDuplicates(int* nums, int numsSize){
//定义left指向数组下标为0的位置
int left = 0;
//定义right指向数组下标为1的位置
int right = 1;
//循环:当right指向数组末尾时停止
while(right < numsSize)
{
if(nums[left] != nums[right])
{
//优化前
// left++;
// nums[left] = nums[right];
// right++;
//优化后
nums[++left] = nums[right++];
}
else
{
right++;
}
}
//返回结果
return left+1;
}
📝结尾
今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!