编程之美:第二章 数字之魅 2.17数组循环移位
2015-08-03 00:57
357 查看
/* 数组循环移位: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 此题已经做过,但本题的收获是注意循环移位,即,当K大于N时,注意到移N位后与没移位是一样的效果。因此 k %= n; 输入: 6 10 5 6 1 2 3 4 输出: 1 2 3 4 5 6 */ /* 关键: 1 k %= iLen;//防止k大于n,简化循环右移的处理 2 rightShift(pArr,0,iLen - k -1);//应该先移动n - k - 1个元素而不是k -1 */ #include <stdio.h> const int MAXSIZE = 10000; void rightShift(int* pArr,int low,int high) { int iTemp; for(; low < high ; low++,high--) { iTemp = pArr[low]; pArr[low] = pArr[high]; pArr[high] = iTemp; } } void reverse(int* pArr,int iLen,int k) { if(!pArr || iLen <= 0) { return; } k %= iLen;//防止k大于n,简化循环右移的处理 rightShift(pArr,0,iLen - k -1);//应该先移动n - k - 1个元素而不是k -1 rightShift(pArr,iLen - k,iLen-1); rightShift(pArr,0,iLen-1); } void print(int* pArr,int iLen) { for(int i = 0 ; i < iLen ; i++) { if(i) { printf(" %d",pArr[i]); } else { printf("%d",pArr[i]); } } printf("\n"); } void process() { int n,k; while(EOF != scanf("%d %d",&n,&k)) { int iArr[MAXSIZE]; for(int i = 0 ; i < n ; i++) { scanf("%d",&iArr[i]); } reverse(iArr,n,k); print(iArr,n); } } int main(int argc,char* argv[]) { process(); getchar(); return 0; }
相关文章推荐
- 编程之美:第二章 数字之魅 2.20程序理解和时间分析
- 编程之美:第三章 结构之法 3.9重建二叉树
- Java_链表实现
- 编程之美:第三章 结构之法 3.10分层遍历二叉树
- 编程之美: 第三章 结构之法 3.2电话号码对应英语单词
- 编程之美:第三章 结构之法 3.8求二叉树中结点的最大距离
- 编程之美:第三章 结构之法 3.3计算字符串的相似度
- 编程之美:第三章 结构之法 3.4从无头单链表中删除节点
- 编程之美:第三章 结构之法 3.7队列中取最大值操作问题
- Python操作Excel实践总结
- google 笔试题: 丑数
- 编程之美:第三章 结构之法 3.6编程判断两个链表是否交叉
- java入门
- LeetCode 210. Course Schedule II(拓扑排序-求有向图中是否存在环)
- 在 ASP.NET MVC 应用中使用 NInject 注入 ASMX 类型的 Web Service
- php正则表达式,在抓取内容进行匹配的时候表现不稳定
- [Java] 利用Java反射机制取代switch catch判断
- java_ EngorgeSnake
- Spring PecClinic宠物医院---安装
- Python内置类型——set