1. 给定一个长度不小于2的数组arr。 写一个函数调整arr,使arr中要么所有的偶数位上都是偶数,要么所有的奇数位上都是奇数上。 要求:如果数组长度为N,时间复杂度请达到O(N),额外空间复杂度请达到O(1),下标0,2,4,6...算作偶数位,下标1,3,5,7...算作奇数位,例如[1,2,3,4]调整为[2,1,4,3]即可
public class oddandEven {
/**
* @param args
*/
public static void main(String[] args) {
int[] arr={1,4,6,2,7,89,3,2,3,5,4};
oddinEven(arr);
// for(int i=0;i<arr.length;i++)
for(int i:arr){
System.out.println(i);
}
}
public static void oddinEven(int[] arr){
int len=arr.length;
int i=0;
int j=1;
while(i<len&&j<len){
while(i<len&&arr[i]%2==0)
i+=2;
while(j<len&&arr[j]%2==1)
j+=2;
if(i<len&&j<len){
// swap(arr[i],arr[j]);
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
}
/*public static void swap(int a,int b){
int temp=a;
a=b;
b=temp;
}*/
}
注意我源代码中注释掉的部分,原来交换数组两个值用的是swap方法,发现程序一运行就变成死循环了,原因在于swap方法根本就没有交换数组的两个值,于是我换成代码中的写法就对了。改程序思想和快速排序中的交换逆序的思想有点类似。
这里应该是值传递和引用传递的问题吧,
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。 引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。