题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
解题思路
设置两个指针p1和p2,分别指向数组的首和尾部,p1向后移动,而p2向前移动。那么在什么情况下p1,p2才能移动呢?题目要求将数组全部奇数移到数组前半部分,偶数都在后半部分!那么显然当p1指向奇数时,可以向后移动,p1指向偶数时则停止等待交换。同样,p2在指向偶数时,可以向前移动,p2指向奇数时停止,然后p1和p2互换元素,刚好将p1指向的偶数和p2指向的奇数交换位置。当p1索引大于p2时,指针移动停止,数组元素交换完毕!
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
public class reOrderArray {
//将数组中奇数的数字全部调整到数偶数前面
public void reOrder(int[] num){
int len=num.length;
if (num==null||len==0){
return;
}
int begin=0;
int end=len-1;
while (begin<end){
while ((begin<end)&&(num[begin]&0x1)!=0){//头指针向后移动,查找偶数
++begin;
}
while ((begin<end)&&(num[end]&0x1)==0){//尾指针向前移动,查找奇数
--end;
}
if (begin<end){
int temp=num[begin];
num[begin]=num[end];
num[end]=temp;
}
}
}
public static void main(String[] args) {
reOrderArray test=new reOrderArray();
int[] array={1,2,3,4,5,6};
test.reOrder(array);
System.out.println(array[0]+" "+array[1]+" "+array[2]);
}
}
总结
本题来源于面试经典教材《剑指offer》中 归属于其他类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
最后,感谢AIAS!
觉得本博客有用的客官,可以给个赞鼓励下! 嘿嘿