题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。
解题思路:双指针
定义头尾指针,其中头指针一直向右移动,直到指的是偶数停止移动,尾指针一直向左移动,直到指的是奇数停止移动,此时如果 i 满足小于 j 就需要将 i 指向的偶数交换到 j 指向的奇数的位置,可以理解为将 j 指向的奇数交换到数组的前面。
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int i=0,j=nums.size()-1;
while(i<=j)
{
while(i<=j&&nums[i]%2==1) i++;
while(i<=j&&nums[j]%2==0) j--;
if(i<j) swap(nums[i],nums[j]);
}
return nums;
}
};
快慢指针。这种方法还挺巧妙。链接
具体思路如下:
用一个指针来查找数组中的奇数,用另一个指针指向奇数应该存储的位置,fast 即表示前者,low 即表示后者,当fast指针找到奇数的位置时,就需要交换fast到规定位置上去,也就是low指针指向的位置。
此时low指针++,用于指向下一个位置的序号。无论遇到什么数字fast都需要一直移动直到遍历完数字为止。
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int low = 0, fast = 0;
while (fast < nums.size()) {
if (nums[fast] & 1) {
swap(nums[low], nums[fast]);
low ++;
}
fast ++;
}
return nums;
}
};