首页 > 试题广场 >

调整数组顺序使奇数位于偶数前面

[编程题]调整数组顺序使奇数位于偶数前面
  • 热度指数:886998 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
推荐
    /**
     * 1.要想保证原有次序,则只能顺次移动或相邻交换。
     * 2.i从左向右遍历,找到第一个偶数。
     * 3.j从i+1开始向后找,直到找到第一个奇数。
     * 4.将[i,...,j-1]的元素整体后移一位,最后将找到的奇数放入i位置,然后i++。
     * 5.終止條件:j向後遍歷查找失敗。
     */
    public void reOrderArray2(int [] a) {
    	if(a==null||a.length==0)
    		return;
        int i = 0,j;
        while(i<a.length){
        	while(i<a.length&&!isEven(a[i]))
        		i++;
        	j = i+1;
        	while(j<a.length&&isEven(a[j]))
        		j++;
        	if(j<a.length){
        		int tmp = a[j];
        		for (int j2 = j-1; j2 >=i; j2--) {
					a[j2+1] = a[j2];
				}
        		a[i++] = tmp;
        	}else{// 查找失敗
        		break;
        	}
        }
    }
    boolean isEven(int n){
    	if(n%2==0)
    		return true;
    	return false;
    }

编辑于 2015-08-18 23:19:51 回复(102)
不想开辟新空间 然而 省事。。。
function reOrderArray(array)
{
    // write code here
  let odd=[] ,even=[]
  array.map(n=>n%2==0? even.push(n) : odd.push(n))
  return odd.concat(even)
}

发表于 2020-12-24 22:01:46 回复(0)
哈哈哈哈,突然想到sort 里面可以传递一个sort 函数,于是写了一下发现成功了。
return array.sort((a, b) => {
    if (a % 2 === 1 && b % 2 === 0) {
      return -1;
    }
    return 1;
  })

100.00%
通过率
40ms
运行时间
7632KB
占用内存

发表于 2020-11-30 19:43:08 回复(0)
剑指offer 13. 调整数组顺序使奇数位于偶数前面 javascript
1.创建两个空数组进行存放左侧和右侧
2.遍历数组,对第i 个%2取余,如果!==0 则存放左侧数组,===0存放右侧数组
3.连接左右两个数组

function reOrderArray(array)
{
    if(array.length<=0) return []
    let left=[],right=[]
    for(let i in array){
        if(array[i]%2 !== 0){
            left.push(array[i])
        }else{
            right.push(array[i])
        }
    }
    return left.concat(right)
}


编辑于 2020-11-21 15:21:11 回复(0)
一、辅助数组
function reOrderArray(array)
{
    let odd = []
    let even = []
    array.forEach(num => {
        if (num % 2 === 0) {
            even.push(num)
        } else {
            odd.push(num)
        }
    })
    return [...odd, ...even]
    // write code here
}

二、in-place方法,这里使用js的splice方法

function reOrderArray(array) {
    let lastOddIdx = -1
    let len = array.length 
    for(let i = 0; i< len; i++) {
        let num = array[i]
       if (num % 2 !== 0) {
            // 删除
            array.splice(i, 1)
            // 变更顺序
            array.splice(lastOddIdx + 1, 0, num)
            lastOddIdx++
        } 
    }
    return array
}


编辑于 2020-11-07 10:48:23 回复(0)
function reOrderArray(array)
{
    //输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
    //使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,
    //并保证奇数和奇数,偶数和偶数之间的相对位置不变。
    let odds = [];
    let evens = [];
    for (let i = 0; i < array.length; i++) {
        if (array[i] % 2 == 1) {
            //res.unshift(array[i]);
            odds.push(array[i]);
        } else {
            //res.push(array[i]);
            evens.push(array[i]);
        }
    }
    return odds.concat(evens);
}
module.exports = {
    reOrderArray : reOrderArray
};

编辑于 2020-09-13 19:14:12 回复(0)
function reOrderArray(array)
{
    var i=0;
    var len=array.length;
    while(i<len){
        if(array[i]%2==0){
            var num=array[i];
            array.splice(i,1);
            array.push(num);
            len--;
            i--;}
        i++;
    }
    return array;
}


思想:每次遇到偶数就把它删除放入后部,这样先删除的偶数可以在后面的偶数族群里排到最先。
发表于 2020-05-26 14:43:09 回复(0)

function reOrderArray(array)
{
    var odd=new Array();
    var even=new Array();
    for(var i=0;i<array.length;i++){
        if(array[i]%2==0){
            even.push(array[i])
        }
        else{
            odd.push(array[i])
        }
    }
    return odd.concat(even)
}

发表于 2020-04-28 15:44:03 回复(0)
function reOrderArray(array)
{
  let odd = []
  let even = []
  array.forEach(v => {
    if (v % 2) {
      odd.push(v)
    }
    else {
      even.push(v)
    }
  })
  return odd.concat(even)
}
编辑于 2020-03-16 20:03:05 回复(0)
function reOrderArray(array)
{
    // write code here
 //将奇数和偶数进行数组分离 在将两个数组拼接在一起
  var odd = [];
  var even = [];
  array.forEach((item,index)=>{
     //if判断法
     /* if(item % 2 ==0){
      even.push(item);
    }else{
      odd.push(item)
    }8*/
    //三目运算法
    item % 2 ==0 ? even.push(item):odd.push(item);

  });
  var result  =odd.concat(even) ;
  return result;
}

编辑于 2020-03-15 20:12:12 回复(0)
/**
 * 我的解题思路:
 * 1.看起来是个数组排序问题,那么怎么用一行代码解决呢
 * 2.使用Array.prototype.sort方法即可实现
 *
 * @param {*} array 
 */
function reOrderArray(array)
{
    // write code here
    return array.sort((a, b) => !(a % 2) && b % 2);
}

/**
 * 排序的解题思路:
 * 1.排序的方法很多种,这里选用插入排序的方法
 * 2.从左到右依次查找奇数
 * 3.找到奇数后将其一步步前移
 *
 * @param {*} array 
 */
function insertReOrderArray(array)
{
    // write code here
    let k = 0;
    for (let i = 0; i < array.length; i++) {
        if (array[i] % 2) {
            let j = i;
            while (j > k) {
                let temp = array[j];
                array[j] = array[j - 1];
                array[j - 1] = temp;
                j--;
            }
            k++;
        }
    }
    return array;
}

/**
 * 社区TOP的解题思路:
 * 1.换个思路,使用空间换取时间的做法
 * 2.先找出奇数,再找出偶数,组合成新的数组
 *
 * @param {*} array 
 */
function topReOrderArray(array)
{
    // write code here
    const odd = array.filter(n => n % 2 === 1);
    const even = array.filter(n => n % 2 === 0);
    return odd.concat(even);
}

发表于 2020-02-29 15:22:33 回复(0)
function reOrderArray(array)
{
    // write code here
    var arr1 = [];
    var arr2 = [];
    for (var i = 0;i < array.length;i++){
        if(array[i] % 2 == 0){
            arr2.push(array[i]);
        }else{
            arr1.push(array[i]);
        }
    }
    return arr1.concat(arr2);
}

编辑于 2019-11-28 11:08:06 回复(0)
正统插排
function reOrderArray(array)
{
    // write code here
    if (!array || !array.length) return;
    
    let cur = -1;
    for (let i = 0; i < array.length; i++) {
        if (array[i] % 2 === 1) {
            const oddVal = array[i];
            let even;
            for (even = i - 1; even > cur; even--) {
                array[even + 1] = array[even];
            }
            array[even + 1] = oddVal;
            cur++;
        }
    }
}
另如果题目把奇偶值改成奇偶下标的话,只需把 array[i] % 2 === 1 改成 i % 2 === 1 就可以了。
代码leetcode执行没问题,不知道为什么在牛客上执行就老报错,而且没有任何提示,也不显示
报错的测试用例
发表于 2019-10-27 16:45:21 回复(0)
function reOrderArray(array)
{
    var len=array.length;
    for(let i=0;i<len;i++){
        if (array[i]%2==0){
            array.push(array.splice(i,1));
            i--;len--;
        }
    }
    return array;
}
当检测到偶数的时候就将偶数从原有数组中取出添加到数组的末尾,同时由于原有数组减了一个数,所以需要同时i--;len--;
发表于 2019-10-22 22:11:44 回复(0)
function reOrderArray(array) {
    return array.filter(val => val % 2 !== 0).concat(array.filter(val => val % 2 === 0));
}
// 能投机则投机【滑稽】

发表于 2019-09-28 23:09:40 回复(0)
function reOrderArray(array)
{
    // write code here
    let array1 = [];
    let array2 = [];
    for(let i=0; i<array.length; i++){
        if(array[i]%2===0){
            array2.push(array[i]);
        }else{
            array1.push(array[i]);
        }
    }
    return array1.concat(array2);
}

发表于 2019-09-16 16:09:10 回复(0)
function reOrderArray(array)
{
    var a = [];
    var b = [];

    for (var i = 0; i < array.length; i++) {
      if(array[i] % 2 == 0) a.push(array[i]);
      else b.push(array[i]);
    }
    return [...b,...a]; 
}


展开运算符
发表于 2019-09-01 14:00:35 回复(0)
//创建新数组;两个循环,第一次先把奇数放进空数组;第二次把偶数接着放进刚才的数组。
function reOrderArray(array)
{
    // write code here
    var arr1 = [];
    for(var i=0; i<array.length; i++){
        if(array[i] %2 != 0){
            arr1.push(array[i]);
        }
    }
    for(i =0 ; i<array.length; i++){
        if(array[i] %2 == 0){
            arr1.push(array[i]);
        }
    }
    return arr1;
}
发表于 2019-08-28 16:14:00 回复(0)
function reOrderArray(array){
    var ji=[];                                           //存放奇数
    var ou=[];                                         //存放偶数
    for(var i=0;i<array.length;i++){        //判断能否被2整除
        if(array[i]%2==1){
            ji.push(array[i]);
        }
        else{
            ou.push(array[i]);
        }
    }
    return ji.concat(ou);                          //返回拼接数组
}
发表于 2019-08-12 11:15:38 回复(0)
js没***啊

function reOrderArray(array)
{
// write code here
var a=[];
for(let i=0;i<array.length;i++){
if(array[i]%2!=0){
a.push(array[i])
}
}

for(let i=0;i<array.length;i++){
if(array[i]%2===0){
a.push(array[i])
}
}
return a;
}

编辑于 2019-08-09 14:58:58 回复(0)

问题信息

难度:
48条回答 300322浏览

热门推荐

通过挑战的用户