面试题21. 调整数组顺序使奇数位于偶数前面

1:题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

 

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2:题目分析

首先这是一个操作一位数组的基本问题,常规想法就是遍历数组标记奇和偶数即可,再创建一个新的数组进行填入即可。算法思路如下

  • 创建新的和原始数等长的数组。
  • 遍历原始数组,遇到偶数,写入新数组尾部,然后偶数指针-1,遇到奇数,写入新数组头部,然后奇数指针+1。

  该方法时间O(n),空间复杂度也为O(n)。

方法二:直接再原始数组上,左右两边同时遍历,左侧找到偶数,右侧找到奇数,然后交换即可,循环结束条件为左侧指针小于有责指针。

  • 初始化,左右侧指针分为别0和length - 1。
  • 左侧循环找偶数,右侧循环找奇数,然后交换,继续循环,知道左指针大于右指针,结束循环。

3:解题代码

class Solution {
    /**
     * 奇数在前,偶数在后
     * @param nums 待调整数组
     * @return 调整后的数组
     */
    //思路分析;从两端开始向中间遍历,知道左端找到一个偶数,右端找到一个奇数后,交换即可。
    //循环结束条件是左指针大于右指针
    public int[] exchange(int[] nums) {
        int l = 0;
        int r = nums.length-1;
        int temp = 0;

        while(true){
            //循环结束条件,l大于r
            if(l>r){
                break;
            }
            while(true){
                //循环结束条件,l大于r
                if(l>r){
                    break;
                }
                //从左向右找到偶数,break
                if(nums[l]%2 == 0){
                    break;
                }
                l++;
            }
            while(true){
                //循环结束条件,l大于r
                if(l>r){
                    break;
                }
                //从右向左找到奇数,break
                if(nums[r]%2 == 1){
                    break;
                }
                r--;
            }
            if(l<r){//只有当l位于r的左侧,才交换。
                temp = nums[l];
                nums[l] = nums[r];
                nums[r] = temp;
            }
        }
        return nums;
    }
}

 

posted @ 2020-03-13 11:01  大朱123  阅读(132)  评论(0编辑  收藏  举报