题目地址:
目录
今天刷训练计划I(调整数组顺序使奇数位于偶数前面),大家有兴趣可以点上看看题目要求,试着做一下。
我们直接看题解吧:
审题目+事例+提示:
未要求不可原地更改数组
思路流程(双指针/快排):
- 创建lef和rig两个指针,分别指向数组两端
- 多循环:
·左边指针循环遇到奇数自动跳过,即lef++
·右边指针循环遇到偶数自动跳过,即rig--
·当lef指向偶数,rig指向奇数时,互相交换
3、返回修改后数组
代码:
class Solution {
public int[] trainingPlan(int[] actions) {
int i = 0, j = actions.length - 1, tmp;
while(i < j) {
while(i < j && (actions[i] & 1) == 1) i++;
while(i < j && (actions[j] & 1) == 0) j--;
tmp = actions[i];
actions[i] = actions[j];
actions[j] = tmp;
}
return actions;
}
}
代码(单循环):
class Solution {
public int[] exchange(int[] nums) {
//定义头指针left
int left = 0;
//定义尾指针right
int right = nums.length-1;
//定义临时变量temp
int temp;
//移动left和right,直到left在right右侧或相遇为止
while(left <right){
//如果左边是偶数,右边是奇数,则交换位置
if(nums[left] % 2 ==0 && nums[right] % 2 == 1){
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
//如果左边是奇数,右边是偶数,左指针向右移动
else if(nums[left] % 2 ==1 && nums[right] % 2 == 1){
left++;
}
//如果左边是偶数,右边也是偶数,则右指针向左移动
else if(nums[left] % 2 ==0 && nums[right] % 2 == 0){
right--;
}
//否则,左指针指向奇数,右指针指向偶数,则左指针向右移动,右指针向左移动
else{
left++;
right--;
}
}
return nums;
}
}