【劍指**】21.調整數組順序使奇數位於偶數前面

21.調整數組順序使奇數位於偶數前面

題目描述1

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的
前半部分,所有的偶數位於位於數組的後半部分.

分析

題目描述1是《劍指OFFER》上給出的描述。只要求數組前面是奇數,後面是偶數。沒要求保持相對位置不變,相對比較簡單。

代碼

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        // 方法1 雙指針
        if (array.empty()) return;
        int left = 0;
        int right = array.size() - 1;
        while (left < right) {
            while (left < right && array[left] % 2 != 0) {
                left++;
            }
            while (left < right && array[right] % 2 == 0) {
                right--;
            }
            if ((array[left] % 2 == 0) && (array[right] % 2 != 0)) {
                int tmp_val = array[left];
                array[left] = array[right];
                array[right] = tmp_val;
            }
        }
    }
};

題目描述2

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的
前半部分,所有的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相
對位置不變。

分析

牛客網上給出的題目要複雜一點,不僅要保證前半部分是奇數,後半部分是偶數。而且要各自相對位置保持不變。所以題目描述1中給出的代碼就沒辦法AC了。
但是,如果犧牲一點空間作爲代價,也有很簡單的寫法,給出的代碼 空間複雜度O(n)。需要額外的申請空間。

週末,比較懶散,所以,沒去想更好的解法了。。。。

代碼

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        if (array.empty()) return;
        vector<int> odd;
        vector<int> even;
        for (int i = 0; i < array.size(); i++) {
            if (array[i] % 2 == 0) {
                even.push_back(array[i]);
            }
            else {
                odd.push_back(array[i]);
            }
        }
        int i = 0, j = 0;
        while (i < array.size() && j < odd.size()) {
            array[i] = odd[j];
            i++;
            j++;
        }
        j = 0;
        while (i < array.size() && j < even.size()) {
            array[i] = even[j];
            i++;
            j++;
        }
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章