NC77 调整数组顺序使奇数位于偶数前面(一)
描述
输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
数据范围:,数组中每个数的值
要求:时间复杂度 ,空间复杂度
进阶:时间复杂度 ,空间复杂度
示例1
输入:
[1,2,3,4]
返回值:
[1,3,2,4]
示例2
输入:
[2,4,6,5,7]
返回值:
[5,7,2,4,6]
示例3
输入:
[1,3,5,6,7]
返回值:
[1,3,5,7,6]
题解
原地暴力位移法
思路:
从0~n遍历整个数组,当遇到奇数的时候将奇数往前移动,并且记录奇数的个数。
代码如下:
#include <bits/stdc++.h>
using namespace std;
void shift(vector<int> &v, int left, int right)// 将v[right]放到v[left],并且将v[left,right-1]右移
{
if (left == right)
{
return;
}
int k = v[right];
while (right > left)
{
v[right] = v[right - 1];
right--;
}
v[left] = k;
}
vector<int> reOrderArray(vector<int> &array)
{
int len = 0;// 用于记录奇数的个数,作为以后移动的起始位置
for (int k = 0; k < array.size(); ++k)
{
if (array[k] % 2 == 1)
{
shift(array, len, k);
len++;
}
}
return array;
}
使用辅助数组的O(N)解法
思路:
- 遍历整个数组,对奇数的个数进行统计
- 申请辅助数组作为返回结果
- 如果是基数则从下标0的位置开始往后放,如果是偶数则从奇数的总个数下标开始往后放
代码如下:
vector<int> reOrderArray(vector<int> &array)
{
int n = array.size();
vector<int> res(n);
int odd = 0;
// 统计奇数个数
for (int i = 0; i < n; i++)
{
if (array[i] % 2)
odd++;
}
// x与y分别表示答案中奇偶数的坐标
int x = 0, y = odd;
for (int i = 0; i < n; i++)
{
if (array[i] % 2)
{
res[x++] = array[i];// 奇数
}
else
{
res[y++] = array[i];// 偶数
}
}
return res;
}