美文网首页我的大千世界
图解LeetCode——剑指 Offer 21. 调整数组顺序使

图解LeetCode——剑指 Offer 21. 调整数组顺序使

作者: 爪哇缪斯 | 来源:发表于2023-02-28 10:09 被阅读0次

    一、题目

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

    二、示例

    2.1> 示例:

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

    提示:

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

    三、解题思路

    根据题目描述,我们需要将原整数数组中所有的奇数放到数组的前半部分,所有的偶数放到数组的后半部分,那么本题就是一道比较标准的双指针算法问题。此时我们就需要创建前指针head和后指针tail,head指针会一直向后遍历,直到遍历到偶数(即:与2取余等于0);然后再将tail指针一直向前移动,直到遍历到奇数(即:与2取余不等于0);确定好了head和tail之后,执行互换操作,即:

    int temp = nums[head];
    nums[head] = nums[tail];
    nums[tail] = temp;

    那么,由于head指针与tail指针是以相对方向移动的,那么肯定会有“碰头”的那一刻,那么当碰头了之后,就说明整个数组nums已经完全遍历完毕,也就是说,所有的奇数和偶数都已经完成了互换的操作。

    关于碰头的判断,我们可以通过如果head小于tail,则说明还未碰头;如果head大于或等于tail,则说明已经碰头了,结束双指针的遍历操作。上面的解题思路大致就是这些,那么还是按照惯例,下图中我们以数组nums=[1, 2, 3, 4]为例,来看一下具体的操作过程:

    四、代码实现

    class Solution {
        public int[] exchange(int[] nums) {
            int head = 0, tail = nums.length - 1;
            while(head < tail) {
                while (nums[head] % 2 != 0 && head < tail) head++;
                while (nums[tail] % 2 == 0 && tail > head) tail--;
                int temp = nums[head];
                nums[head] = nums[tail];
                nums[tail] = temp;        
            }
            return nums;
        }
    }
    

    今天的文章内容就这些了:

    写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享

    更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(o)/ ~ 「干货分享,每天更新」

    相关文章

      网友评论

        本文标题:图解LeetCode——剑指 Offer 21. 调整数组顺序使

        本文链接:https://www.haomeiwen.com/subject/ubqlldtx.html