首页 > 代码库 > [读书笔记·编程珠玑] 数组移位(待填坑)
[读书笔记·编程珠玑] 数组移位(待填坑)
要求:已知一个一维数组 arr ,现在要求将它向左旋转n个位置。
方法一:
假设允许开辟一个临时空间,那么问题就变得简单了,可以开辟一个跟arr长度相同的空间,然后隔n个位置不断添加元素即可,思路比较简单,下面是代码实现:
void RotateLeft1(vector<int> &arr, const int step) { vector<int> ret; int sz = arr.size(); ret.resize(sz); for (int i = 0; i < arr.size(); ++i) { ret[ (sz + i - step) % sz ] = arr[i]; } arr = ret; }
方法二:
如果不允许开辟辅助空间,那就只能对现有的一维数组进行操作了,可以实现一个每次左移一位的函数RotateLStep():
///// 之前的第一种方法由于要考虑new开辟的辅助空间的回收问题,数组使用了STL中的vector。而此处开始数组全部用传统的数组 void RotateLStep(int *arr, int sz) //向左移动一位 { int first = arr[0]; for (int i = 0; i < sz - 1; ++i) { arr[i] = arr[i + 1]; } arr[sz - 1] = first; } void RotateLeft2(int *arr, int sz, int step) { while (step--) { RotateLStep(arr, sz); } }
但是显而易见,这种方法的效率太低了,RotateLStep()的时间复杂度为 O(N),-+
方法三:
方法四:
[读书笔记·编程珠玑] 数组移位(待填坑)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。