1. 题目来源
链接:调整数组顺序使奇数位于偶数前面
来源:LeetCode——《剑指-Offer》专项
2. 题目说明
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例1:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
- 1 <= nums.length <= 50000
- 1 <= nums[i] <= 10000
3. 题目解析
方法一:双指针+位运算解法
题意明确,是道简单题,原书上主要考虑的是代码的可拓展性,程序尽量解耦提高代码重用性。
双指针解法,就没什么好讲的了,采用位运算判断奇偶情况算是优化点。 用 and
代替 &&
也是很有意思很形象的写法了。😃
参见代码如下:
// 执行用时 :24 ms, 在所有 C++ 提交中击败了76.91%的用户
// 内存消耗 :20.6 MB, 在所有 C++ 提交中击败了100.00%的用户
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
while (((nums[left] & 1) != 0) and left < right) ++left;
while (((nums[right] & 1) == 0) and left < right) --right;
swap(nums[left], nums[right]);
}
return nums;
}
};