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

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

题目描述

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

题目思路

一、头尾交换

  1. 指定一个头结点和尾结点。
  2. 当头结点不等于尾结点,执行以下顺序
    • 判断头节点的数字是不是偶数,如果是偶数那么和尾结点交换
    • 尾结点--
    • 判断交换回来的头结点是不是还是偶数,如果是那么头结点不动继续循环
    • 如果是奇数那么头结点下移一位。
public int[] exchange(int[] nums) {
        //末尾下标
        int tail  = nums.length -1;
        int head = 0;
        //遍历数组,如果遇见奇数就不管
        //如果遇见偶数就和后面的交换
        while (head < tail){
            //如果是偶数则和后面交换
            if ((nums[head]) % 2 == 0){
                int temp = nums[tail];
                nums[tail] = nums[head];
                nums[head] = temp;
                tail -- ;
            }
            //判断还回来的是奇数还是偶数
            if (nums[head] %2 != 0){
                head ++;
            }
        }
        return nums;
    }

二、双指针实现

  1. 左右指针
  2. 左边当遇见偶数时停止
  3. 右边遇见奇数停止
  4. 交换两边直到左边等于右边
    public int[] exchange(int[] nums){
        //定义左右指针
        int left = 0;
        int right = nums.length -1;
        //当左边指针大于等于右边指针结束
        while(left < right){
            //先遍历左边直到偶数出现
            while((left < right)&&(nums[left] & 1 ) == 1){
                left ++;
            }
            //然后遍历右边直到奇数出现
            while ( (left < right) && (nums[right] & 1) == 0){
                right --;
            }
            //交换两个数字
            if (left< right){
                int temp = nums[left];
                nums[left]  = nums[right];
                nums[right] = temp;
            }

        }
        return nums;
    }
posted @ 2020-08-08 15:15  杨小星儿  阅读(103)  评论(0)    收藏  举报