输入一个长度为 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]
//很简单的两遍遍历,结果却很慢。。还好过了 public int[] reOrderArray (int[] array) { int count = 0; for (int i = 0; i < array.length; i++) { if (array[i]%2 == 1) { count ++; } } int[] result = new int[array.length]; int sig = 0; int dou = count; for (int i = 0; i < array.length; i++) { if (array[i]%2 == 1) { result[sig++] = array[i]; } else { result[dou++] = array[i]; } } return result; }
选择具有稳定性的排序方法, 例如冒泡
public int[] reOrderArray (int[] array) { // bubble sort if (array == null || array.length == 0) return new int[0]; int n = array.length; boolean changed = true; for (int i=n-1; i>0 && changed; i--) { changed = false; for (int j=0; j<i; ++j) { // 左边是偶数, 右边是奇数的情况 if ((array[j] & 1) == 0 && (array[j+1] & 1) == 1) { changed = true; int tmp = array[j]; array[j] = array[j+1]; array[j+1] = tmp; } } } return array; } }
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); });