题目
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部。
思路
- 两个指针a和b,a指向第一个数字,b指向最后一个数字;
- a向后移动直到指向一个偶数,b向前移动直到指向一个奇数,交换两数;
- 直到a和b指向同一个数。
代码
public static void reorder(int[] array){
if (array==null){
return;
}
int pre=0;
int tail=array.length-1;
int temp=0;
while (pre<tail){
while (!isOdd(array[pre]))
pre++;
while (isOdd(array[tail]))
tail--;
temp=array[pre];
array[pre]=array[tail];
array[tail]=temp;
}
}
public static boolean isOdd(int n){
return (n & 1) == 1;
}
相关问题
上面的如果不改变原来数组中奇数和偶数的先后顺序:
public static void reOrder1(int[] array){
if (array==null)
return;
int[] result=new int[array.length];
int count=0;
for (int anArray : array) {
if ((anArray & 1) != 0) {
result[count] = anArray;
count++;
}
}
for (int anArray : array) {
if ((anArray & 1) == 0) {
result[count] = anArray;
count++;
}
}
// java传递的是副本
// Java参数,不管是原始类型还是引用类型,传递的都是副本
// array=result;
/**
* 当一个对象实例作为一个参数被传递到方法中时,
* 参数的值就是该对象的引用一个副本。
* 指向同一个对象,对象的内容可以在被调用的方法中改变,
* 但对象的引用(不是引用的副本)是永远不会改变的。
*/
System.arraycopy(result, 0, array, 0, array.length);
}