905. Sort Array By Parity(easy)

clipboard.png
题目理解:
一个数组中全是非负数,现在要我们把偶数放在前面,奇数放在偶数之后

首先想到的做法:声明一个新的vector,扫描A两遍,第一遍插入偶数,第二遍插入奇数,返回新的vector
可能优化方向:

  • 扫描一遍
  • 不分配新空间

于是想到了新的做法:用两个指针标记位置,两个指针分别从前往后和从后往前扫描
比较两个指针所指的数据有4种情况:

情况 对应操作
前奇后偶 交换位置,i向后移,j向前移
前偶后奇 不用交换,i往后移,j往前移
前后全是偶数 不用交换,i往后移
前后全是奇数 不用交换,j往前移

其实这种做法的本质就是利用两个指针在O(N)时间里达到了和之前扫描两次同样的效果,并且维护了原数组,就不用再分配新的空间了,这也是一种比较常用的做法。
在实际代码里我对i,j移动的时机做了一些改动,结果是一样的,但是看起来可能更简单,也可以分成四种情况逐一用if...else if来写。
accept代码

class Solution {
public:
    vector<int> sortArrayByParity(vector<int>& A) {
        int i = 0, j = A.size() - 1;
        int n = A.size();
        while (i < j)
        {
            if (A[i] % 2 != 0 && A[j] % 2 != 1)
                swap(A[i++], A[j--]);
            if (A[i] % 2 == 0)
                i++;
            if (A[j] % 2 == 1)
                j--;
        }
        return A;
    }

};

重点:

  • 两个指针

832. Flipping an Image

题目

clipboard.png
理解:
题目已经说得非常清楚了,就是把有一个只包含0和1的二维数组,先把每一个子数组颠倒顺序,再把0都变成1,1都变成0

解法
就是照着题目说的做就行了。。
可能的优化:

  • 位运算来转化0,1

accept代码

class Solution {
public:
    vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
        int size_A = A.size();
        for (int i = 0; i < size_A; i++)
        {
            int size_of_each_vector = A[i].size();
            int p_begin = 0, p_end = size_of_each_vector - 1;
            while (p_begin < p_end)
            {
                A[i][p_begin] ^= 1;
                A[i][p_end] ^= 1;
                swap(A[i][p_begin++], A[i][p_end--]);
            }
            if (p_begin == p_end)
                A[i][p_begin] ^= 1;
        }
        return A;
    }
};

这里我手动实现了翻转,当然也可以用reverse函数

reverse(vec.begin(),vec.end());

顺便注意一下,当子数组元素个数为奇数的话,最中间的数需要特判一下
通过以后看了一下官方解法,感觉写得非常简洁,学习一下(java版):

class Solution {
    public int[][] flipAndInvertImage(int[][] A) {
        int C = A[0].length;
        for (int[] row: A)
            for (int i = 0; i < (C + 1) / 2; ++i) {
                int tmp = row[i] ^ 1;
                row[i] = row[C - 1 - i] ^ 1;
                row[C - 1 - i] = tmp;
            }

        return A;
    }
}




ereret2
12 声望1 粉丝