在贴吧看到一个po出来的笔试题,是关于数组操作的,感觉跟当初大学考试题似的,如下:
一个长度为n的整型数组,处理后将奇数在前,偶数在后,请编写个程序,要求空间复杂度为常数,时间复杂度为O(n)。
最先考虑到的思路就是定义两个变量:begin和end,分别从数组两头开始遍历(条件就是begin
public static int[] getNewArr(int[] arr){
int len = arr.length;
int begin = 0;
int end = len-1;
int temp = 0;// 暂存当前遍历的元素值
if(len<=0){
return null;
}else{
while(begin<end){
if(arr[begin]%2==0){// even number
temp = arr[begin];
}
if(arr[end]%2!=0){// odd number
arr[begin] = arr[end];// *
arr[end] = temp;// *
begin++;// *
end--;// *
}else{
end--;// end指针继续移动,需找下一个奇数
}
}
}
return arr;
}
写完之后,看一下空间复杂度,使用了temp用来交换位置,空间复杂度:S(1);时间复杂度:O(n)。循环操作的代码就是注释星号的代码,在最坏的情况下也就是要重复执行n-1次,因此时间复杂度为O(n)。