剑指Offer-调整数组顺序使奇数位于偶数前面
题目描述#
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路#
思路一:
首先统计奇数的个数,然后拷贝一个数组,设置两个指针,奇数指针从0开始,偶数指针从奇数个数的末尾开始遍历,填充到原数组
时间复杂度$O(n)$ 空间复杂度$O(n)$
思路二:
由于要保证稳定即证奇数和奇数,偶数和偶数之间的相对位置不变,使用插入排序思想
时间复杂度$O(n^2)$ 空间复杂度$O(1)$
代码实现#
package Array;
/**
* 调整数组顺序使奇数位于偶数前面
* 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
*/
public class Solution48 {
public static void main(String[] args) {
Solution48 solution48 = new Solution48();
int[] array = {1, 2, 3, 4, 5, 6};
solution48.reOrderArray_2(array);
for (int i :
array) {
System.out.print(i + " ");
}
}
/**
* 由于要保证稳定即证奇数和奇数,偶数和偶数之间的相对位置不变,使用插入排序思想
* 复杂度:O(N2) + O(1)
*
* @param array
*/
public void reOrderArray_2(int[] array) {
if (array.length == 0 || array == null)
return;
int n = array.length;
for (int i = 0; i < n; i++) {
if (array[i] % 2 == 0) {
int nextOddIdx = i + 1;
while (nextOddIdx < n && array[nextOddIdx] % 2 == 0) {
nextOddIdx++;
}
if (nextOddIdx == n) {
break;
}
int nextOddVal = array[nextOddIdx];
for (int j = nextOddIdx; j > i; j--) {
array[j] = array[j - 1];
}
array[i] = nextOddVal;
}
}
}
/**
* 新建一个数组
* 复杂度:O(N) + O(N)
*
* @param array
*/
public void reOrderArray(int[] array) {
int oddCnt = 0;
for (int val : array) {
if (val % 2 == 1) {
oddCnt++;
}
}
int[] copy = array.clone();
int i = 0, j = oddCnt;
for (int num : copy) {
if (num % 2 == 1) {
array[i++] = num;
} else {
array[j++] = num;
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?