剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

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

示例:

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

提示:

0 <= nums.length <= 50000
1 <= nums[i] <= 10000

做题思路:

这道题算剑指offer里面理解和做比较简单,但如何用多种思路做题,也是一种学习的方法。

一、借助辅助数组

class Solution {
        public int[] exchange(int[] nums) {
            int index = 0;
            int[] res = new int[nums.length];
            //借助两个for循环,把奇数的数放前面,偶数的数放后面,然后再返回res即可
            for (int num : nums) {
                if (num %2 == 1)
                    res[index++] += num;
            }
            for (int num : nums) {
                if (num % 2 != 1)
                    res[index++] += num;
            }
            return res;
        }
    }

二、类似于快排或者头尾双指针的方法

class Solution {
        public int[] exchange(int[] nums) {
        	//设置左右指针
            int l = 0;
            int r = nums.length - 1;
            //在while循环里面,l向右移动指向了奇数,r向左移动指向了偶数,只有当l大于r的时候才结束循环。
            //当然也会交换l和r所指向的数字
            while (l <= r) {
                if (l <= r && nums[l] % 2 == 1)
                    l++;
                if (l <= r && nums[r] % 2 == 0)
                    r--;
                if (l > r)
                    break;
                int tmp = nums[l];
                nums[l] = nums[r];
                nums[r] = tmp;
            }
            return nums;
        }
    }

三、快慢双指针

这个做题思路借鉴了LeetCode的郁郁雨。

快慢双指针:

1、slow和fast都设置在数组的头部,而不是像之前一个在头部,一个在数组尾部

2、fast如果遇到奇数,则和slow交换,没有则右移

3、等fast遍历到末尾结束遍历

class Solution {
        public int[] exchange(int[] nums) {
            int slow = 0, fast = 0;
            while (fast < nums.length) {
                if (nums[fast] % 2 == 1) {
                    int tmp = nums[fast];
                    nums[fast] = nums[slow];
                    nums[slow] = tmp;
                    slow++;
                }
                fast++;
            }
            return nums;
        }
    }
posted @ 2021-08-01 15:35  RainsX  阅读(38)  评论(0)    收藏  举报