输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
示例1
输入:
[1,2,3,4]
返回值:
[1,3,2,4]
解:如果非得相对位置不变
采用笨方法:
vector<int> reOrderArray(vector<int>& array) {
// write code here
vector<int> resultOdd;
vector<int> resultEven;
for(auto i : array) {
if (i % 2) {
resultOdd.push_back(i);
}
else {
resultEven.push_back(i);
}
}
resultOdd.insert(resultOdd.end(),resultEven.begin(), resultEven.end());
return resultOdd;
}
};
其实牛客上需要顺序不变。书上和leetcode上都不需要
方法二:
双指针法: 头一个,尾巴一个,判断奇数偶数+±-,
注意continue,灵魂啊!!!!!!!!!!!
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int nfirst = 0, nsencond = nums.size() - 1;
while(nfirst < nsencond) {
if (nums[nfirst] % 2 == 1) {
nfirst ++;
continue;// 灵魂啊!!!!!!!!!!!!!!!
}
if (nums[nsencond] % 2 == 0 ){
nsencond --;
continue;//灵魂啊!!!!!!!!!!!!!!!
}
swap(nums[nfirst],nums[nsencond]);
}
return nums;
}
};
方法三:
剑指offer表示,得能扩展,如果让你排序三的倍数呢???
所以秒offer的来了
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int nfirst = 0, nsencond = nums.size() - 1;
while(nfirst < nsencond) {
if (func(nums[nfirst])) {
nfirst ++;
continue;
}
if (!func(nums[nsencond])){
nsencond --;
continue;
}
swap(nums[nfirst],nums[nsencond]);
}
return nums;
}
bool func(int number) {
if (number % 2) {
return 1; //奇数
}
return 0; //偶数
}
};