13

mac2024-10-16  58

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

package com.hwx.swordToOffer._13_reOrderArrayFromOddAndEven; /* * 题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分, 所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 */ public class Solution { /* * 在要求不额外增加空间的条件下,这个方法更好。 插入排序的思想:遇到奇数时,往偶数前插入 */ public void reOrderArray(int[] array) { int insertIndex = 0; int insertValue = 0; for (int i = 0; i < array.length; i++) { insertIndex = i - 1;// 当前元素的前一个下标 insertValue = array[i];// 当前元素的值 if (insertValue % 2 == 1) {//当前元素是奇数时才往前插入 //while循环用于寻找插入的位置 //insertIndex >= 0保证不越界 //array[insertIndex] % 2 == 0 前一个元素为偶数时才将前一个元素后移一位 while (insertIndex >= 0 && array[insertIndex] % 2 == 0) { array[insertIndex + 1] = array[insertIndex];//将前一个元素后移一个位置 insertIndex--;//继续往前比较 } //循环结束后找到位置,即为insertIndex后一个位置 if (insertIndex + 1 != i) { array[insertIndex + 1] = insertValue; } } } } /* * 我的方法。额外使用一个数组。简单易懂 * 分类:将偶数按顺序放入新数组中,奇数仍在原数组中排序。最后用新数组往后复购原数组 */ public void reOrderArray2(int[] array) { int[] evenArr = new int[array.length]; int odd = 0; int even = 0; for (int i = 0; i < array.length; i++) { if (array[i] % 2 == 1) { array[odd++] = array[i]; } else { evenArr[even++] = array[i]; } } //for循环结束后,even移动到偶数个数的位置,所以要置零进行覆盖 even = 0; while (odd < array.length) { array[odd++] = evenArr[even++]; } } }
最新回复(0)