leetcode刷题记录-905.按奇偶排序数组[java,数组]

题目

给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。

你可以返回满足此条件的任何数组作为答案。

示例:

输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-array-by-parity
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的代码

class Solution {
    public int[] sortArrayByParity(int[] A) {
        if (A.length == 1) {return A;}
        for (int i=0,j=A.length-1; i<j; i++,j--) {
            while (A[i]%2 == 0) {
                i++;
                if (i >= j) {break;}
            }
            while (A[j]%2 == 1) {
                j--;
                if (i >= j) {break;}
            }
            if (i >= j) {break;}
            int temp = A[i];
            A[i] = A[j];
            A[j] = temp;
        }
        return A;
    }
}

小结

真的是非常非常非常非常挫败的一题。
脑子里一直没有很好的双指针的概念,导致一开始的打算是用两个数组分别存奇数和偶数,然后数组合并。
按照python的写法,是不可能存在数组越界问题的,但是java是有的,但我也不愿意预先new一个超出所需长度的数组。于是我发现了ArrayList。
但是这个ArrayList真的好难啊,add的内容必须是一个对象(Object)。这不是要命吗?我当然一开始是完全不知道该怎么办的。然后看到一个例子是add(new Integer(1),可谓豁然开朗。
那么新的问题又来了,最后需要返回的是一个int[],这里就涉及list2array的问题,于是我发现了方法toArray(),新的问题又来了,这个方法返回Object[],真的,我不知道该如何把它转换回int[],至今都不知道。
最后崩溃的我偷瞄了一眼评论区大神,意识到了双指针方法。
但是事情并没有结束,运行过程中还遇到了数组越界问题,我很费解,这如何越界?
原来是,如果数组内所有的数都是偶数或者奇数,按照我的while逻辑指针会越界。
不说了,都是累,还很菜,路还很长。

官方更优解

class Solution {
    public int[] sortArrayByParity(int[] A) {
        int start = 0;
        int end = A.length-1;
        while (start < end){
            if (A[start]%2 == 1 && A[end]%2 == 0){
                int tmp = A[start];
                A[start] = A[end];
                A[end] = tmp;
                start++;
                end--;
            }else if(A[start]%2 == 0 && A[end]%2 == 0){
                start++;
            }else if (A[start]%2 == 1 && A[end]%2 == 1){
                end--;
                
            }else{
                start++;
                end--;
            }
        }
        return A;
    }
}

恍然大悟,两个指针的位置应该一起作为检测标准,只检测一个越界判断就会像我最终实现的方案一样复杂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值