输入一个长度为 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]
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
int n = array.length;
int p = 0;
while (p < n) {
if (array[p] % 2 == 0) {
int q = p + 1;
while (q < n) {
if (array[q] % 2 != 0) {
int temp = array[q];
for (int i = q; i > p; i--) {
array[i] = array[i - 1];
}
array[p] = temp;
break;
}
q++;
}
if (q == n) break;
}
p++;
}
return array;
}
} import java.util.*;
public class Solution {
boolean isOdd(int num) {
return (num & 1) == 1;
}
public int[] reOrderArray(int[] array) {
int n = array.length;
int[] result = new int[n];
int index = 0;
for (int i = 0; i < n; i++) {
if (isOdd(array[i])) {
result[index++] = array[i];
}
}
index = n - 1;
for (int i = n - 1; i >= 0; i--) {
if (!isOdd(array[i])) {
result[index--] = array[i];
}
}
return result;
}
} public int[] reOrderArray (int[] array) {
// write code here
int len=array.length ,p1=0 ,p2=len-1;
int[] res=new int[len];
for(int i=0;i<len;i++){
if(array[i]%2==1){
res[p1++]=array[i];
}
if(array[len-1-i]%2==0){
res[p2--]=array[len-1-i];
}
}
return res;
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
for (int i = array.length - 1; i >= 0; i--) {
int j = i;
while (array[j] % 2 == 0 && j + 1 < array.length && array[j + 1] % 2 == 1) {
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
j++;
}
}
return array;
}
} import java.util.*;
public class Solution {
public int[] reOrderArray (int[] array) {
// write code here
//记录偶数的个数
int odd = 0;
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 == 0) {
odd++;
}
}
// 偶数数组
int[] a = new int[odd];
// 奇数数组
int[] b = new int[array.length - odd];
for (int i = 0,j = 0, k =0; i < array.length;i++) {
if (array[i] % 2 == 0) {
// 偶数
a[k++] = array[i];
}else {
//奇数
b[j++] = array[i];
}
}
//新数组c
int[] c = new int[array.length];
//把奇数数组添加到c数组
System.arraycopy(b,0,c,0,b.length);
//把偶数数组添加到c数组
System.arraycopy(a,0,c,b.length,a.length);
return c;
}
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
// start_jishu, start_oushu
int sj = 0, so = 0, tmp = 0;
int len = array.length;
boolean flag = false;
for (int i = 0; i < len; i++){
// 在数组最前面的奇数不处理
if (!flag && array[i]%2 == 1) continue;
// 找到数组第一个偶数的下标 so
if (!flag) {
flag = true;
so = i;
continue;
}
// 在第一个偶数后面的偶数不需要处理
if (array[i]%2 == 0) continue;
// 在第一个偶数后面的奇数需要前移
tmp = array[i];
for (int j = i-1; j >= so; j--) array[j+1] = array[j];
array[so] = tmp;
so++;
}
return array;
}
} public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
//双指针,左边的指针指向最靠左的偶数, 右指针进行遍历
int left=-1;
int right=0;
int temp;
while(right<array.length){
if(left==-1){
if(array[right]%2==0){
left=right;
}
}
else{
if(array[right]%2!=0){
//全部往右边平移一个单位
temp=array[right];
for(int i=right;i>left;i--){
array[i]=array[i-1];
}
array[left]=temp;
left++; //最靠左的偶数右边挪一位
}
}
right++;
}
return array;
}
} public int[] reOrderArray (int[] array) {
int[] b = new int[array.length];
int k = 0;
for(int i = 0; i <array.length;++i){
if(array[i] %2 != 0){
b[k++] = array[i];
}
}
for(int i = 0; i <array.length;++i){
if(array[i] %2 == 0){
b[k++] = array[i];
}
}
return b;
} 还有一种,插入排序的思想,碰到奇数将其插入到前面 int temp = 0;
for(int i = 0;i < array.length;++i){
temp = array[i];
if(array[i] %2 != 0 && i != 0){
int j ;
for(j = i; j>0 &&array[j-1] % 2==0;--j){
array[j] = array[j-1];
}
array[j] = temp;
}
}
return array;
//和插入排序差不多
//不同点在于,在用变量j进行遍历的过程中,需要用d记录需要插入的位置(即前面数据中的偶数的位置)
public class Solution {
public int[] reOrderArray (int[] array) {
int d=0;
int j=0;
while (d<array.length&&j<array.length){
while (j<array.length&&(array[j]&1)==0) j++;
if(j==array.length) return array;
int temp=array[j];
for (int i=j-1;i>=d;i--){
array[i+1]=array[i];
}
array[d]=temp;
//其实这里仔细想一想,还是挺妙的
//如果是奇数,两个变量一起走,如果遇到是偶数了,d留在原地,j自己走
//走到不是偶数位置
//这样也保证了,d++所得到的元素,一定是偶数
d++;
j++;
}
return array;
}
} 用2个list分别存放奇数和偶数
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray (int[] array) {
// write code here
ArrayList<Integer> p = new ArrayList<>();
ArrayList<Integer> q = new ArrayList<>();
for (int i = 0; i < array.length; i++) {
if (array[i] % 2 != 0) {
p.add(array[i]);
} else {
q.add(array[i]);
}
}
p.addAll(q);
int[] a = new int[array.length];
for (int i = 0; i < array.length; i++) {
a[array.length-1-i] = p.get(array.length-1-i);
}
return a;
}
}
public int[] reOrderArray (int[] array) { // write code here if(array.length<2){ return array; } int x = 0; Queue<Integer> queue = new LinkedList<>(); int[] result = new int[array.length]; for(int i = 0; i< array.length;i++){ if(array[i]%2==1){ result[x++] = array[i]; }else{ queue.add(array[i]); } } while (!queue.isEmpty()){ result[x++] = queue.poll(); } return result; }
import java.util.*;
public class Solution {
public int[] reOrderArray (int[] array) {
if(array.length<=1) return array;
LinkedList<Integer> list=new LinkedList<>();
int a=0;int b=array.length-1;
while(b>=0){
if(array[b]%2!=0) list.addFirst(array[b]);
b--;
}
while(a<=array.length-1){
if(array[a]%2==0) list.addLast(array[a]);
a++;
}
int j=0;
while(!list.isEmpty()){
array[j++]=list.removeFirst();
}
return array;
}
} import java.util.*;
public class Solution {
public int[] reOrderArray (int[] array) {
// 解法1:暴力
int ret[] = new int[array.length];
// 先处理奇数
int index=0;
for(int i=0;i<array.length;i++){
if(array[i]%2==1)
ret[index++]=array[i];
}
// 再处理偶数
for(int i=0;i<array.length;i++){
if(array[i]%2==0)
ret[index++]=array[i];
}
return ret;
}
} public class Solution {
public int[] reOrderArray (int[] array) {
// 解法2:仿照冒泡
for(int i=0;i<array.length-1;i++){
for(int j=0;j<array.length-i-1;j++){
// 用j+1表示当前位,j表示上一位
// 只有当前位是奇数,且上一位是偶数的情况下,才能swap(当前位,上一位)
// 否则如果2位都是奇数,会发生相对位置的越位交换
if(array[j+1]%2==1 && array[j]%2==0){
int temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
return array;
}
}