输入一个长度为 n 整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
数据范围:
,数组中每个数的值
要求:时间复杂度
,空间复杂度
进阶:时间复杂度
,空间复杂度
[1,2,3,4]
[1,3,2,4]
[2,4,6,5,7]
[5,7,2,4,6]
[1,3,5,6,7]
[1,3,5,7,6]
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> reOrderArray(vector<int>& array) {
// 时间复杂度O(N),空间复杂度O(1)
vector<int> res(array.size(), 0);
int ind = 0;
for (int i = 0; i < array.size(); ++i)
if (array[i] & 1) res[ind++] = array[i];
for (int i = 0; i < array.size(); ++i)
if (!(array[i] & 1)) res[ind++] = array[i];
return res;
}
}; typedef struct SL//定义一个结构体模板
{
int* vate;//int指针/数组
int size;//实际数位计数
int capecity;//空间大小
}SL;
void init(SL* tr)//初始化
{
tr->vate = NULL;
tr->capecity = tr->size = 0;
}
void rea_cp(SL* tr)//扩容
{
int new_capecity = tr->capecity == 0 ? 4 : tr->capecity * 2;
int* tep = (int*)realloc(tr->vate, sizeof(int)*new_capecity);
tr->vate = tep;
tr->capecity = new_capecity;
}
int* reOrderArray(int* array, int arrayLen, int* returnSize )
{
// write code here
SL tr_1, tr_2;//声明两个结构体对象
init(&tr_1);//初始化两个结构体
init(&tr_2);
for(int i = 0; i<arrayLen; i++)//区分
{
if(array[i] % 2 == 0)//偶数放在tr_2中
{
if(tr_2.size == tr_2.capecity)//检查空间
{
rea_cp(&tr_2);
}
tr_2.vate[tr_2.size++] = array[i];
}
else//奇数放在tr_1中
{
if(tr_1.size == tr_1.capecity)//检查空间
{
rea_cp(&tr_1);
}
tr_1.vate[tr_1.size++] = array[i];
}
}
if(tr_2.size == arrayLen)//若偶数组等于原数组数位,则代表全是偶数,返回
{
*returnSize = tr_2.size;
return tr_2.vate;
}
if(tr_1.size == arrayLen)//若基数组等于原数组数位,则代表全是奇数,返回
{
*returnSize = tr_1.size;
return tr_1.vate;
}
for(int j = 0; j < tr_2.size; j++)//如果不是以上,则将偶数组元素插入倒奇数组后
{
if(tr_1.size == tr_1.capecity)//检查扩容
{
rea_cp(&tr_1);
}
tr_1.vate[tr_1.size++] = tr_2.vate[j];//倒数
}
*returnSize = tr_1.size;//返回
return tr_1.vate;
} public int[] reOrderArray (int[] array) {
int[] temp = new int[array.length];
int i,j = 0;
for(i = 0;i<array.length;i++){
if(array[i]%2!=0){
temp[j] = array[i];
j++;
}
}
for(i = 0;i<array.length;i++){
if(array[i]%2==0){
temp[j] = array[i];
j++;
}
}
return temp;
// write code here
} function reOrderArray( array ) {
// write code here
let odd = [];
let even = [];
array.forEach(num => {
if(num % 2 === 0) {
even.push(num);
} else {
odd.push(num);
}
});
return odd.concat(even);
} function reOrderArray( array ) {
// write code here
let even = array.filter(n => n % 2 === 0);
let odd = array.filter(n => n % 2 === 1);
return odd.concat(even);
} function reOrderArray( array ) {
// write code here
let indexHead = 0;
let resultArr = [];
for(let i = 0;i < array.length;i++) {
if(array[i] % 2 === 0) {
resultArr.push(array[i]);
} else {
resultArr.splice(indexHead,0,array[i]);
indexHead++;
}
}
return resultArr;
} function reOrderArray( array ) {
// write code here
let result = [];
for(let i = 0;i < array.length;i++) {
if(array[i] % 2 !== 0) {
result.push(array[i]);
array.splice(i,1);
i--;
}
}
return result.concat(array)
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
if (array == null) return null;
if (array.length == 0 || array.length == 1) return array;
List<Integer> odd = new ArrayList<>();
List<Integer> even = new ArrayList<>();
List<Integer> res = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 0) {
even.add(array[i]);
} else {
odd.add(array[i]);
}
}
odd.forEach(i -> res.add(i));
even.forEach(i -> res.add(i));
return res.stream().mapToInt(i -> i).toArray();
}
} class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型vector
*/
vector<int> reOrderArray(vector<int>& array) {
// write code here
int len=array.size();
for(int i=0;i<len;){
if(array[i]%2==0){
int temp=array[i];
for(int j=i+1;j<array.size();j++){
array[j-1]=array[j];
}
--len;
array[array.size()-1]=temp;
}else{
i++;
}
}
return array;
}
}; 遍历,遇到偶数就把剩下部分前移,偶数置于最后。
function reOrderArray( array ) {
// write code here
let arr1 = [],arr2 = []
for(let item of array){
if(item % 2 == 0) arr2.push(item)
else arr1.push(item)
}
return arr1.concat(arr2)
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
int [] odd=new int [array.length];
int [] even=new int[array.length];
int [] result=new int [array.length];
for(int i=0;i<array.length;i++){
if(array[i]%2==0){even[i]=array[i];}
else{odd[i]=array[i];}
}
int j=0;
for(int i=0;i<odd.length;i++){
if(odd[i]!=0){
result[j]=odd[i];
j++;
}
}
for(int i=0;i<even.length;i++){
if(even[i]!=0){
result[j]=even[i];
j++;}
}
return result;
}
} 扫描两遍复制到数组即可
vector<int> reOrderArray(vector<int>& arr)
{
vector<int> ret(arr.size());
int idx = 0;
for (auto num : arr) {
if (num&1)
ret[idx++] = num;
}
for (auto num : arr) {
if (!(num&1))
ret[idx++] = num;
}
return ret;
} 可以采用 插入排序、冒泡排序、归并排序、基数排序 等 稳定 排序算法
stable_sort(arr.begin(), arr.end(), [](int a, int b) -> bool {
return a&1 && !(b&1);
});
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
int[] result = new int[array.length];
for (int i = 0; i < array.length; i ++) {
for (int j = 0; j < array.length-i-1; j ++) {
if (array[j]%2 == 0 && array[j+1]%2 == 1) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
return array;
}
}
class Solution: def reOrderArray(self , array ): # write code here if not array: return [] for passnum in range(len(array)-1, 0, -1): for i in range(passnum): if array[i] % 2 == 0 and array[i+1] % 2 != 0: array[i], array[i+1] = array[i+1], array[i] return array
//解题思路
/*(O(n),O(n))
遍历两次数组,第一次只添加奇数到新数组里,第二次只添加奇数到新数组里
*/
public int[] reOrderArray (int[] array) {
int index = 0;
int[] res = new int[array.length];
for (int i : array) {
if (i % 2 != 0) {
res[index] = i;
index++;
}
}
for (int i : array) {
if (i % 2 == 0) {
res[index] = i;
index++;
}
}
return res;
}