代码之家  ›  专栏  ›  技术社区  ›  Marecky

如何将整数数组划分为偶数和奇数?

  •  -2
  • Marecky  · 技术社区  · 7 年前

    [1,2,3,4,5,6,7,8] ),第一个分区应保留偶数值,第二个应保留奇数值(示例结果: [2,4,6,8,1,3,5,7]

    Array.prototype 方法。第一个解决方案使用 map sort ,仅第二个 分类 .

    array.sort((el1, el2)=>(el1 % 2 - el2 % 2)) )…我看着 quicksort ,但我不知道在哪里应用检查整数是偶数还是奇数。。。

    4 回复  |  直到 7 年前
        1
  •  2
  •   Jim Mischel    7 年前

    你可以很容易地在O(n)时间内完成这项工作。在前面开始偶数索引,在后面开始奇数索引。然后,遍历数组,跳过第一个偶数块。

    当你碰到一个奇数时,从末尾向后移动以找到第一个偶数。然后交换奇偶数。

    代码如下所示:

    var i;
    var odd = n-1;
    for(i = 0; i < odd; i++)
    {
        if(arr[i] % 2 == 1)
        {
            // move the odd index backwards until you find the first even number.
            while (odd > i && arr[odd] % 2 == 1)
            {
                odd--;
            }
            if (odd > i)
            {
                var temp = arr[i];
                arr[i] = arr[odd];
                arr[odd] = temp;
            }
        }
    }
    

    请原谅任何语法错误。Javascript不是我的强项。

    [1,2,7,3,6,8] [8,2,6,3,7,1] 。数组已分区,但奇数的相对顺序与原始数组中的不同。

        2
  •  0
  •   Bergi    7 年前

    return [arr.filter(predicate), arr.filter(notPredicate)] 方法,可以使用两个索引轻松高效地实现,从阵列的两侧运行,并在必要时交换:

    function partitionInplace(arr, predicate) {
        var i=0, j=arr.length;
        while (i<j) {
            while (predicate(arr[i]) && ++i<j);
            if (i==j) break;
            while (i<--j && !predicate(arr[j]));
            if (i==j) break;
            [arr[i], arr[j]] = [arr[j], arr[i]];
            i++;
        }
        return i; // the index of the first element not to fulfil the predicate
    }
    
        3
  •  -1
  •   frozen    7 年前
    let evens = arr.filter(i=> i%2==0);
    let odds = arr.filter(i=> i%2==1);
    let result = evens.concat(odds);
    

    编辑: 或者如果你真的关心效率:

    let evens, odds = []
    arr.forEach(i=> {
    if(i%2==0) evens.push(i); else odds.push(i);
    });
    let result = evens.concat(odds);
    
        4
  •  -2
  •   Mehmet Otkun    7 年前
    Array.prototype.getEvenOdd= function (arr) {
        var result = {even:[],odd:[]};
        if(arr.length){
          for(var i = 0; i < arr.length; i++){
            if(arr[i] % 2 = 0)
                result.odd.push(arr[i]);
            else
                result.even.push(arr[i]);
          }
        }
        return result ;
    };