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

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

https://www.nowcoder.com/practice/ef1f53ef31ca408cada5093c8780f44b?tpId=13&&tqId=11166&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

解法一、

直观的处理逻辑,开辟一个结果数组,第一趟遍历原数组,将原数组中的奇数依次挪到结果数组中;第二趟再遍历一遍原数组,将原数组中的偶数再依次挪到结果数组中。

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
import java.util.*;

public class Solution {
    public int[] reOrderArray (int[] a) {
        if (a == null) 
            return null;
        int[] ret = new int[a.length];
        int i = 0;
        for (int j = 0; j < a.length; j++) { // 第一趟,依次移动奇数
            if (a[j] % 2 != 0) {
                ret[i++] = a[j];
            }
        }
       for (int j = 0; j < a.length; j++) { // 第二趟,依次移动偶数
            if (a[j] % 2 == 0) {
                ret[i++] = a[j];
            }
        }
        return ret;
    }
}

解法二、插入排序思想

使用插入排序的思想,就地处理,不用开辟新的空间,但是没找到一个奇数都要向前判断这个奇数应该插入的位置,因此时间复杂度上并不经济,但是可以加深对于插入排序的理解。

特点:

  • 就地变动
  • 每个奇数一次跟前一个数进行比较,如果前面一个是偶数,就跟他交换,一直交换到队首或前面是奇数。
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)
import java.util.*;


public class Solution {
    public int[] reOrderArray (int[] a) {
        if (a == null) 
            return null;
        int j, tmp;
        for (int p = 1; p < a.length; p++) { // 插入排序的思想
            tmp = a[p];
            for (j = p; j > 0 && isOdd(tmp) && isEven(a[j-1]); j--) {
                a[j] = a[j-1];
            }
            a[j] = tmp;
        }
        return a;
    }

    private boolean isOdd(int x) {
        return (x & 0B1) != 0; // 奇数
    }

    private boolean isEven(int x) {
        return (x & 0B1) == 0; // 偶数
    }
}
全部评论

相关推荐

01-04 07:53
门头沟学院 C++
心愿便利贴:工作了以后回头再看待这个问题,从客观的视角来讲是因为每个人对自己的要求不同,学习好的人对自己的要求很高,所以觉得考不好就天塌了,认为自己学习好并且值得一份好工作的人也是一样,找不到符合自己预期的工作肯定也会觉得是侮辱,牛客上有很多名校大学生,肯定会存在这种好学生心态啊,“做题区”从来都不是贬义词,这是大部分普通人赖以生存的路径,这个有什么好嘲讽的,有“好学生心态”没有错,但是不要给自己太大的压力了
点赞 评论 收藏
分享
2025-12-15 12:50
河北工程大学
sta666:我也是这个国际商业化的,三天,一天一面,就通过了,不过我是后端实习生,好好面感觉能过。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务