leetcode刷题记录之905

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数组新长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值