博客主页:@聆风吟的个人主页
系列专栏:本期文章收录在《剑指offer每日一练》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!
作者留言:文章创作不易,可能会有些地方出现错误,还希望广大读者们能够帮忙指出,让我们大家一起共同进步。
☁️寄语:少年有梦不应止于心动,更要付诸行动。
⌈ 在线OJ链接,可以转至此处自行练习 ⌋
题目:
教练使用整数数组 actions
记录一系列核心肌群训练项目编号。为增强训练趣味性,需要将所有奇数编号训练项目调整至偶数编号训练项目之前。请将调整后的训练项目编号以 数组
形式返回。
示例:
输入: actions = [ 1, 2, 3, 4, 5 ]
输出: [ 1, 3, 5, 2, 4 ]
解释: 正确答案不为一
限制:
解题思路:
采用双指针
定义双指针 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;
}
};
⌈ 在线OJ链接,可以转至此处自行练习 ⌋
题目:
购物车内的商品价格按照升序记录于数组 price
。请在购物车中找到两个商品的价格总和刚好是 target
。若存在多种情况,返回任一结果即可。
示例:
输入: price = [ 3, 4, 12, 15 ], target = 16
输出: [ 4, 12 ] 或者 [ 12, 4 ]
限制:
解题思路:
采用双指针
定义双指针 left
和 right
分别位于数组的左右两端,循环执行(当指针相遇时,跳出):
right--
;left++
;若循环结束,则返回空数组,代表无和为 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 {};
}
};
今天的内容就到这里了,你们都学会了吗?如果还有疑问的话请在评论区里多多提问,大家可以一起帮你解决,让我们共同进步。创作不易,如果对你有用的的话点个赞支持下作者,你们的支持是作者创作最大的动力。关注我不迷路。