class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
vector<int> odd, even;
for(int i=0; i<len; i++) {
if((array[i]&0x1) == 1) {
odd.push_back(array[i]);
} else {
even.push_back(array[i]);
}
}
int oddLen = odd.size(), evenLen = even.size();
for(int i=0; i<oddLen; i++) {
array[i] = odd[i];
}
for(int i=0; i<evenLen; i++) {
array[oddLen+i] = even[i];
}
}
};
这种方法以空间换时间。代码还算简洁。
因为要求稳定性暂时没想到时间复杂度n,空间复杂度1的算法。
刚开始写了一个不稳定的(本以为稳定),写的还挺复杂,除了稳定性功能应该没问题,贴出来:
class Solution {
public:
void reOrderArray(vector<int> &array) {
int len = array.size();
int index1 = -1, index2 = -1;
for(int i=0; i<len; i++) { // 寻找第一个偶数
if((array[i] & 0x1) == 0) {
index1 = i;
break;
}
}
if (index1<0 || index1 == len-1) return; // 没有偶数或最后一个数是偶数
for(int i=index1+1; i<len; i++) {
if((array[i] & 0x1) == 1) {
index2 = i;
break;
}
}
if (index2 < 0) return; // 后面没有奇数了
while(index2<len) {
swap(array, index1, index2);
index1++;
index2++;
while((array[index2] & 0x1) == 0 && index2<len-1) {
index2++;
}
}
return;
}
void swap(vector<int> &array, int index1, int index2) {
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
};
那些没过的原因:
&比==优先级低,判断的时候要加括号
用了swap却忘写
引用的传值不太清楚;
for循环中;写成 ,