剑指offer题解汇总 Java实现
https://blog.csdn.net/guliguliguliguli/article/details/126089434
本题链接
知识分类篇 - 其他算法 - JZ21 调整数组顺序使奇数位于偶数前面(一)
题目
思路 & 代码
方案一 计算奇数的个数
- 创建一个长度和array数组长度一样的新数组res
- 遍历数组,计算出奇数的个数odd
- 定义两个指针,x=0,y=odd。从下标0至odd-1一共odd个数,正好存储odd个奇数
- 遍历数组,如果当前值是奇数,那么存储在res[x]的位置;如果当前值是偶数,那么存储在res[y]的位置
- 返回res数组
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray(int[] array) {
// write code here
int[] res = new int[array.length];
int odd = 0;
for (int value : array) {
if ((value & 1) != 0) {
odd++;
}
}
int x = 0;
int y = odd;
for (int value : array) {
if ((value & 1) != 0) {
res[x++] = value;
} else {
res[y++] = value;
}
}
return res;
}
}
方案二 插入排序思想
用变量j来记录下标为j之前的内容以全部存放了奇数
变量temp用来记录当前循环中数组的值
- 如果当前值是偶数,则跳过
- 如果当前值是奇数,则将从j下标开始,到当前数组位置之前(下标是j-1)的数全部往后移一位,也就是说,把当前位置上的这个奇数放到j下标的位置,其余数字全部往后移一位
【举例】
j=2,表示数组中下标0、1的位置已经全部摆放了奇数,如果后面有再遇到奇数,则放置在下标为2的位置
j=2,当前数组是[1, 3, 2, 4, 5]
循环到i=4的时候,array[4]=5,5是奇数
用变量temp保存一下array[4]这个值5
所以要把从下标2到下标3的数往后移一位,[1, 3, 2, 2, 4]
然后,把temp赋值给array[j],[1,3,5,2,4]
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param array int整型一维数组
* @return int整型一维数组
*/
//使用插入排序的思想
public int[] reOrderArray(int[] array) {
// 首先是对数值长度进行特判
if (array == null || array.length == 0)
return array;
//记录已经是奇数的位置
int j = 0;
int temp = 0;
for (int i = 0; i < array.length; i++) {
temp = array[i];
//如果该值为偶数
if (array[i] % 2 == 0) {
continue;
}
//该值为奇数
int k = i;
while (k > j) {
//这区间整体向后移动一位
array[k] = array[k - 1];
k--;
}
//移位之后将对应的值赋值
array[k] = temp;
j++;
}
//返回结果数数组
return array;
}
}
方案三 双指针
- 创建一个新数组,长度和array长度一致
- 定义四个指针
- 其中两个指向原数组的首和尾
- 另外两个指向新数组中的首和尾
- left指针从左向右遍历数组,right指针从右向左遍历数组
- left指针遇到奇数,则从res数组的左边开始添加
- right指针遇到偶数,则从res数组的右边开始添加
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param array int整型一维数组
* @return int整型一维数组
*/
public int[] reOrderArray(int[] array) {
// write code here
int[] res = new int[array.length];
int left = 0, right = array.length - 1;
int res_left = 0, res_right = res.length - 1;
while (left < array.length && right >= 0) {
if ((array[left] & 1) != 0) {
res[res_left++] = array[left];
}
left++;
if ((array[right]&1)==0){
res[res_right--] = array[right];
}
right--;
}
return res;
}
}