输入一个长度为 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; } }