逆序数组问题

来源:互联网 发布:培训淘宝 编辑:程序博客网 时间:2024/05/16 10:03

在面试的时候,面试官让我翻转一个数组,例如 [1,2,3,4,5],翻转后 [5,4,3,2,1],这个题目其实可以说是非常简单,我就想当然的写下

void reverse(int *a,int s, int e){if(s >= e)return ;for(int i = s; i <= s + (e-s)/2; ++i){int temp = a[i];a[i] = a[e - i + s];a[e - i + s] = temp;}}
当时我给面试官讲了思路,就是让前半部分元素和后半部分元素交换,面试官看了以后,问我,还有没有更好的算法?

因为这个算法已经是O(N)的算法了,只需要交换一半的元素,在效率上不可能有更大的飞跃,那么优化的话,只能说是优化常数项,那么假设数组长为N,那么在N/2次循环中,每次发生三次赋值。因此算法执行的基本操作数为 3*(N/2);

事实上,面试官提示是,能不能采用数组反向拷贝。其实这种方法我也考虑到,但是面试官也没说,函数怎么定义,是在原数组上进行操作,还是将反转的数组存放在另一个地方。

按照他的说法,翻转数组函数就变成了这样。

void reverse(int *src,int *dest,int s, int e){int index = 0;for(int i = e; i >= s; --i){dest[index++] = src[i];}return;}
在这种情况下,基本操作次数降到了N次,但需要额外的空间开销,或者是在函数内,或者是在函数外。面试官的意思是,有些代码运行在手机、平板上,CPU的执行力不是很强,其实我理解,用空间换时间是可以接受的做法。但总觉得有些牵强。我也不做评判。

在STL里,也有reverse函数,其实现也更精简,且按照思路改写下来学习一下:

void reverse(int *src,int s, int e){while(s < e){swap(src[s++],src[e--]);}return;}

inline swap(int &a, int &b){int temp = a;a = b;b = temp;} 


通过指针的方式访问数组元素比通过[]访问方式要快,但通过[]的方式,别较容易理解。在实际中,还是尽量掌握指针的写法。


0 0
原创粉丝点击