题目描述
思路
双指针
记nums长度为n,新建一个长度为n的数组ans保存排序结果。遍历nums,遇到偶数则从ans的左侧开始替换元素,遇到奇数从ans的右侧开始替换元素。遍历完成后,ans就保存了排序完毕的数组。
Python实现
class Solution:
def sortArrayByParity(self, nums: List[int]) -> List[int]:
n = len(nums)
ans, left, right = [0] * n, 0, n-1
for num in nums:
if num % 2 == 0:
ans[left] = num
left += 1
else:
ans[right] = num
right -= 1
return ans
Java实现
class Solution {
public int[] sortArrayByParity(int[] nums) {
int n = nums.length;
int[] ans = new int[n];
int left = 0, right = n-1;
for (int num : nums) {
if (num % 2 == 0) {
ans[left++] = num;
} else {
ans[right--] = num;
}
}
return ans;
}
}
交换
记数组nums的长度为n。从nums左侧开始遍历,如果是偶数,就表示该元素已经排好序,继续往右遍历,直到遇到一个奇数。然后从nums右侧开始遍历,如果遇到的是奇数,就表示这个元素已经排好序,继续往左遍历,直到遇到一个偶数。交换这个奇数和偶数的位置,并且重复两边的遍历,直到在·中间相遇,nums排序完毕。
Python实现
class Solution:
def sortArrayByParity(self, nums: List[int]) -> List[int]:
left, right = 0, len(nums)-1
while left < right:
while left < right and nums[left] % 2 == 0:
left += 1
while left < right and nums[right] % 2 == 1:
right -= 1
if left < right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
return nums
class Solution {
public int[] sortArrayByParity(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
while (left < right && nums[left] % 2 == 0) {
left++;
}
while (left < right && nums[right] % 2 == 1) {
right--;
}
if (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
return nums;
}
}