方法一:首尾指针:时间O(n),空间O(1)
题解:交换首部的偶数和尾部的奇数,然后让指针一个++,一个 - -,直到left >= right
- 首部指针:只要 left 的数值为奇数,则一直++
- 尾部指针:只要 right 的数值为偶数,则一直 - -
class Solution {
public:
vector<int> exchange(vector<int>& nums)
{
// 1.双指针
int left = 0, right = nums.size() - 1;
while (left < right)
{
if (nums[left] & 1)
{
left++;
continue;
}
if (!(nums[right] & 1))
{
right--;
continue;
}
swap(nums[left++], nums[right--]);
}
return nums;
}
};
方法二:快慢指针:时间O(n),空间O(1)
题解:只要快指针碰到奇数,则交换快慢指针的数值,且慢指针++
- 快指针:如果是偶数则++,如果是奇数则交换再++
- 慢指针:每进行交换一次的时候进行++
class Solution {
public:
vector<int> exchange(vector<int>& nums)
{
// 2.快慢指针
int slow = 0, fast = 0;
while (fast < nums.size())
{
if (nums[fast] & 1)
{
swap(nums[slow], nums[fast]);
slow++;
}
fast++;
}
return nums;
}
};
类似题目
- 这个题目最大的坑就是:奇数位上是奇数或者偶数位上是偶数,只需要保证一个成立就行
- 也就是可能出现奇数太多不能保证奇数位上都是奇数
题解:双指针,从数据尾部开始判断,向前插数据
- 如果数据尾部是奇数,则插入 i 位置,且i += 2
- 如果数据尾部是偶数,则插入 j 位置,且j += 2
class Solution {
public:
/**
* 奇数位上都是奇数或者偶数位上都是偶数
* 输入:数组arr,长度大于2
* len:arr的长度
* 将arr调整成奇数位上都是奇数或者偶数位上都是偶数
*/
void oddInOddEvenInEven(vector<int>& arr, int len)
{
int i = 0, j = 1;
while (i < len && j < len)
{
if (arr[len - 1] & 1) // 奇数,放奇数位
{
swap(arr[len - 1], arr[j]);
j += 2;
}
else
{
swap(arr[len - 1], arr[i]);
i += 2;
}
}
}
};