import java.util.Arrays;
import java.util.Random;
import ljn.help.Helper;
public class OddBeforeEven {
/**
* Q 54 调整数组顺序使奇数位于偶数前面
* 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。
* update at 2012-04-20:
* "quickSort" is O(nlgn).So it does not work
* Now we trade space for time.
* Create another array which has the same length as the array to be sorted.
* Odd number is inserted from front,Even number from tail.
*/
public static void main(String[] args) {
int[] x=new int[10];
for(int i=0;i<10;i++){
x[i]=i;
}
System.out.println(Arrays.toString(x));
sort2(x);
System.out.println(Arrays.toString(x));
System.out.println("================================");
rearrange(x);
System.out.println(Arrays.toString(x));
sort(x);
System.out.println(Arrays.toString(x));
}
//O(n)--Odd number is inserted from front,Even number from tail.
public static void sort(int[] x){
if(x==null||x.length==0){
return;
}
int len=x.length;
int[] tmp=new int[len];
int oddPos=0;
int evenPos=len-1;
for(int i=0;i<len;i++){
if(!isEven(x[i])){
tmp[oddPos++]=x[i];
}else{
tmp[evenPos--]=x[i];
}
}
System.arraycopy(tmp, 0, x, 0, len);
}
//O(nlgn)--like Quick Sort.Find a even from the beginning and a odd from the last.Swap them.
public static void sort2(int[] x){
if(x==null||x.length==0){
return;
}
int len=x.length;
int i=0;
int j=len-1;
while(i<j){
if(!isEven(x[i])){
i++;
continue;
}
if(isEven(x[j])){
j--;
continue;
}
if(isEven(x[i])&&!isEven(x[j])){
Helper.swap(x,i,j);
}
}
}
public static boolean isEven(int x){
return (x&1)==0;
}
/*
20120423 update
1. for i:=1 to n do swap(a[i], a[random(1,n)]); // 凑合,但不是真正随机
2. for i:=1 to n do swap(a[i], a[random(i,n)]); // 真正的随机算法
其中,random(a,b)函数用于返回一个从a到b(包括a和b)的随机整数。
*/
public static void rearrange(int[] x){
int len=x.length;
for(int i=0;i<len;i++){
int j=new Random().nextInt(len);
Helper.swap(x, i, j);
}
}
}
分享到:
相关推荐
title: 剑指Offer-调整数组顺序使奇数位于偶数前面subtitle: 调整数组顺序使奇数位于偶数前面categories: 剑指Offer调整数组顺序
java基础面试题调整数组顺序使奇数位于偶数前面本资源系百度网盘分享地址
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面剑指 Offer 21. 调整数组顺序使奇数位于偶数前面输入一个整数数组,实现一个函数来调整该数组中数字
面试题21. 调整数组顺序使奇数位于偶数前面题目链接面试题21. 调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并
本文主要探讨了如何使用Java实现一种特殊的数组调整方法,即将数组中的所有奇数移动到前半部分,所有偶数移动到后半部分,同时保持原有奇数与奇数、偶数与偶数之间的相对顺序不变。 首先,我们来看一下这个问题的...
调整数组顺序使奇数位于偶数前面 链表中倒数第 k 个节点 - [移除单链表倒数第 n 个节点] - leetcode 19 反转链表 - [反转单链表] - leetcode 206 合并两个排序的链表 - [合并两个有序链表]- leetcode 21 树的子结构 ...
题目14:调整数组顺序使奇数位于偶数前面 这题需要将数组中的奇数和偶数分开,但保持原有顺序。可以使用两个指针,一个从头开始,一个从尾开始,分别处理奇数和偶数。 题目15至24:这些题目可能包括了更多的二叉树...
3. 当`begin`和`end`指针相遇或者交叉时,循环结束,此时数组已经满足条件,奇数都在偶数前面。 4. 最后,输出排序后的数组,以便验证结果。 此算法的核心在于,由于我们只在找到合适的奇偶数对时才进行交换,所以...
总的来说,这个特定的归并排序实现考虑了数组中偶数位置元素已排序的情况,通过调整分治策略,可能优化了排序过程。然而,由于没有具体的代码实现,我们无法详细分析这种优化是如何进行的。要了解更多信息,应查看`...
本文主要分析了三个使用双指针技术解决的题目,分别来自剑指Offer计划13的Java实现,包括调整数组顺序使奇数位于偶数前面、寻找和为s的两个数字以及翻转单词顺序。 1. **调整数组顺序使奇数位于偶数前面** 题目...
Interviews(剑指offer Java代码)二维数组中的查找替换空格从尾到头打印链表重建二叉树用两个栈实现队列旋转数组的最小数字斐波那契数列跳台阶变态跳台阶矩形覆盖二进制中1的个数数值的整数次方调整数组顺序使奇数...
13、调整数组顺序使奇数位于偶数前面 14、链表倒数第k个节点 15、反转链表 16、合并两个排序列表 17、树的子结构 18、二叉树的镜像 19、顺时针打印矩阵 20、包含min函数的栈 21、栈的压入、弹出序列 22、从上到下...
请注意,这个实现假设数组的大小为奇数,对于偶数大小的数组,需要进行适当的调整。 在压缩包中的 `Snakearray.java` 文件可能包含了具体的实现细节,例如如何初始化和填充数组,以及如何处理边界条件等。通过阅读...
调整数组顺序使奇数位于偶数前面 面试题22 链表中倒数第k个节点 面试题24 反转链表 面试题25 合并两个排序的链表 面试题26 树的子结构 面试题27 二叉树的镜像 面试题28 对称的二叉树 面试题29 顺时针打印矩阵 面试题...
剑指21_调整数组顺序使奇数位于偶数前面_双指针 剑指22_链表的倒数第K的节点_链表_双指针 剑指24_反转链表_链表 剑指25_合并两个有序的链表_链表 剑指27_二叉树的镜像_二叉树 剑指28_对称二叉树_二叉树 剑指29_...
涵盖了二维数组中的查找、替换空格、从尾到头打印链表、重建二叉树、用两个栈实现队列、旋转数组的最小数字、斐波那契数列、二进制中1的个数、打印1到最大的n位数、在O(1)时间删除链表节点、调整数组顺序使奇数位于...
题目143的核心是重新排列链表,使得所有奇数索引的节点出现在所有偶数索引节点之前,同时保持原始链表中节点的相对顺序。例如,对于输入链表1->2->3->4,重排后应为1->3->2->4。这个过程可以分为三个主要步骤: 1. ...
在C++或Java等编程语言中,可以使用数组来实现顺序表。顺序表的主要操作包括插入、删除、查找等,而本程序的重点是查找奇数。 奇数查找是在顺序表中寻找所有奇数的过程。在顺序表中,我们可以遍历数组,通过检查每...
14调整数组顺序使奇数位于偶数前面 15链表中倒数第k个结点 16反转链表 17合并两个排序的链表 18树的子结构 19二叉树的镜像 20顺时针打印矩阵 21包含min函数的栈 22栈的压入弹出序列 23从上往下打印二叉树 24二叉搜索...