将数组的后面m个数移动为前面m个数
2016-06-18 21:50
232 查看
题目:如何将数组的后面m个数移动为前面m个数。
思路分析:
有n个整数,使前面各数后移m个位置,最后m个数变成最前面m个数。例如,有10个数的数组,即 n=10,它们的值分别是 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,如果取 m=5的话,经过位置调整后,变为 6, 7, 8, 9, 10, 1, 2, 3, 4, 5。
可以通过递归的方法实现调整:
(1)将前 m个元素的顺序颠倒。
(2)将后面 n - m 个元素的顺序颠倒。
(3)将 n 个元素的顺序全部颠倒。
通过以上三个步骤的执行,就可以把数组的元素颠倒。以上例而言,第一步以后,数组顺序变为:5, 4, 3, 2, 1, 6, 7, 8, 9, 10;第二步以后,数组顺序变为:5, 4, 3, 2, 1, 10, 9, 8, 7, 6;第三步以后,数组顺序变为:6, 7, 8, 9, 10, 1, 2, 3, 4, 5;正是题目要求的,此时结束运算。
备注:递归逆序已经在字符串逆序(一)这篇博客中探讨过。
思路分析:
有n个整数,使前面各数后移m个位置,最后m个数变成最前面m个数。例如,有10个数的数组,即 n=10,它们的值分别是 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,如果取 m=5的话,经过位置调整后,变为 6, 7, 8, 9, 10, 1, 2, 3, 4, 5。
可以通过递归的方法实现调整:
(1)将前 m个元素的顺序颠倒。
(2)将后面 n - m 个元素的顺序颠倒。
(3)将 n 个元素的顺序全部颠倒。
通过以上三个步骤的执行,就可以把数组的元素颠倒。以上例而言,第一步以后,数组顺序变为:5, 4, 3, 2, 1, 6, 7, 8, 9, 10;第二步以后,数组顺序变为:5, 4, 3, 2, 1, 10, 9, 8, 7, 6;第三步以后,数组顺序变为:6, 7, 8, 9, 10, 1, 2, 3, 4, 5;正是题目要求的,此时结束运算。
#include <iostream> using namespace std; // 递归逆序 void Reverse(int *start, int *end) { while (start < end) { int temp = *start; *start++ = *end; *end-- = temp; } } void Adjust(int *arr, int n, int m) { Reverse(arr,arr + m - 1); // 前m个数顺序颠倒 Reverse(arr + m, arr + n - 1); // 后n-m个数顺序颠倒 Reverse(arr, arr + n - 1); // 所有数顺序颠倒 } int main(int argc, const char * argv[]) { int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int len = sizeof(arr)/sizeof(arr[0]); Adjust(arr, len, 5); for (int i = 0; i < len; i++) cout << arr[i] << ' '; cout << endl; return 0; }
备注:递归逆序已经在字符串逆序(一)这篇博客中探讨过。
相关文章推荐
- Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕
- 数据库知识整理<八>
- 个人附加作业
- 2016年上半年总结
- 系统重启后 sda sdb顺序变化 pv vg lv dm
- PHP操作MySQL
- Spark Streaming揭秘 Day27 Job产生机制
- 《构建之法》读后感系列之二
- 理解java Web项目中的路径问题
- JS正则学习
- C++编程对缓冲区的理解
- iOS 下载缓存网络图片 SDWebImage
- 附加作业
- 图结构练习——判断给定图是否存在合法拓扑序列
- 使用xpath新增、查找、删除、上下移动节点
- 表空间及组成表空间的物理文件
- void类型及void指针
- 字节序两种类型的通俗理解
- Android实现卫星菜单(一)自定义属性及重写onMeasure、onLayout方法
- Hibernate不同DB的日期查询