逆序数组问题
来源:互联网 发布:培训淘宝 编辑:程序博客网 时间: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
- 逆序数组问题
- 问题一百三十四:数组逆序
- 树状数组求解逆序问题
- 归并排序&&数组中逆序对问题
- 第十六周 问题 A: 逆序输出数组
- 归并排序/逆序数组对问题
- 数组逆序
- 数组逆序
- 数组逆序
- 数组逆序
- 数组逆序
- 数组逆序
- 逆序数组
- 数组逆序
- 数组逆序
- 数组逆序
- 数组逆序
- 数组之数组逆序
- 常见算法在实际项目中的应用
- UIEvent 和几个一点就懂的例子
- 配置ssh公钥访问oschina
- 一个让人哭笑不得的问题
- 使用接插件需要注意的问题
- 逆序数组问题
- DSP6000的上电及供电
- VNCserver的启动和停止
- 读书札记-2013年12月
- DSP6000的几个简单优化技巧
- hdu 5027 Help!(计算几何 三分求极值)
- 数字信号处理的学习资源
- 唯品会测试工程师面试
- 北大"小师妹"走红 网友赞许预备役校花