905、按奇偶排序数组
给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例 1:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
提示:
- 1 <= A.length <= 5000
- 0 <= A[i] <= 5000
难度:简单 题目地址:https://leetcode-cn.com/problems/sort-array-by-parity/
1、C语言代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortArrayByParity(int* A, int ASize, int* returnSize){
int* ans = malloc(sizeof(int)*ASize);
int t = 0;
for (int i = 0; i < ASize; ++i){
if (A[i] % 2 == 0)
ans[t++] = A[i];
}
for (int i = 0; i < ASize; ++i){
if (A[i] % 2 == 1)
ans[t++] = A[i];
}
*returnSize = ASize;
return ans;
}
解释: 两遍扫描,第一遍输出偶数,第二遍输出奇数。
知识点回顾: 无。
2、Java代码:
class Solution {
public int[] sortArrayByParity(int[] A) {
int i = 0, j = A.length - 1;
while (i < j) {
if (A[i] % 2 > A[j] % 2) {
int tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
if (A[i] % 2 == 0) i++;
if (A[j] % 2 == 1) j--;
}
return A;
}
}
解释: 原地算法,如果希望原地排序,可以使用快排,一个经典的算法。
维护两个指针 i 和 j,循环保证每刻小于 i 的变量都是偶数(也就是 A[k] % 2 == 0 当 k < i),所有大于 j 的都是奇数。
所以, 4 种情况针对 (A[i] % 2, A[j] % 2):
- 如果是 (0, 1),那么万事大吉 i++ 并且 j–。
- 如果是 (1, 0),那么交换两个元素,然后继续。
- 如果是 (0, 0),那么说明 i 位置是正确的,只能 i++。
- 如果是 (1, 1),那么说明 j 位置是正确的,只能 j–。
通过这 4 种情况,循环不变量得以维护,并且 j-i 不断变小。最终就可以得到奇偶有序的数组。
知识点回顾: 快排的思想,将在数据结构篇中单独描述。
3、Python代码:
class Solution:
def sortArrayByParity(self, A: List[int]) -> List[int]:
i = 0;
for j in range(len(A)):
if A[j] % 2 == 0:
A[i], A[j] = A[j], A[i]
i += 1
return A
解释: 、双指针同向遍历,初始状态都指在数组左端,后面指针不断加一,遇到偶数就交换到前面去,再把前面指针加一,指导后面指针遍历完数组结束。
知识点回顾: 无。
4、JavaScript代码:
/**
* @param {number[]} A
* @return {number[]}
*/
var sortArrayByParity = function(A) {
var B = []
for (var i = 0; i < A.length; i++) {
if (A[i] % 2 === 0) {
B.unshift(A[i])
} else {
B.push(A[i])
}
}
return B
};
解释: 一次循环,如果为偶数就添加到头部,如果为奇数就添加到尾部。
知识点回顾:
1、unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
注意: 该方法将改变数组的数目。
提示: 将新项添加到数组末尾,请使用 push() 方法。
语法:array.unshift(item1,item2, …, itemX)
item1,item2, …, itemX:必需。向数组起始位置添加一个或者多个元素。
返回值:Number数组新长度。
2、push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
注意: 新元素将添加在数组的末尾。
注意: 此方法改变数组的长度。
提示: 在数组起始位置添加元素请使用 unshift() 方法。
语法:array.push(item1, item2, …, itemX)
item1,item2, …, itemX:必需。要添加到数组的元素。
返回值:Number数组新长度。