0
点赞
收藏
分享

微信扫一扫

[数组]NC77 调整数组顺序使奇数位于偶数前面(一)-中等

大明宫 2022-07-27 阅读 63

​​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)解法

思路:

  1. 遍历整个数组,对奇数的个数进行统计
  2. 申请辅助数组作为返回结果
  3. 如果是基数则从下标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;
}


举报

相关推荐

0 条评论