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++;
}
}
};