数组循环右移的算法
2013-10-14 22:41
309 查看
今天朋友碰到一个面试题:
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度位O(N),空间复杂度为O(1)。
顺理成章的思考方式就是挨个换位,
123456789
789123456 // 如果N是(K%N)的倍数,则需要多个起点
567891234 // 设置一个起点就可以交换完
代码如下(声明只是思路,代码没有经过测试):
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度位O(N),空间复杂度为O(1)。
顺理成章的思考方式就是挨个换位,
123456789
789123456 // 如果N是(K%N)的倍数,则需要多个起点
567891234 // 设置一个起点就可以交换完
代码如下(声明只是思路,代码没有经过测试):
void move( type arr[], int N, int K ) { int nOffset = K % N; if ( nOffset == 0 ) return ; int n = 0; int i = 0; int j = i; type Temp1 = arr[j]; type Temp2 = 0; do { j = ( j + nOffset ) % N; Temp2 = arr[j]; arr[j] = Temp1; // 如果N是K的倍数 则需要新设置跳跃的起点 if ( j == i ) { j = ++i; Temp1 = arr[j]; } else Temp1 = Temp2; n++; } while ( n < N -1 ) // 总共要交换(N-1)次 }
相关文章推荐
- pdf file to txt file using pdfbox
- C语言入门篇-10
- Understanding Unix/Linux Programming note:chapter 1:more函数的流程图
- 获取客户端的ip地址
- C#中的枚举器(转)
- bootstrap学习笔记
- 如何在开发项目里和难缠的程序员合作?
- 获取容器中的表单值封装成object
- apache ssl
- Java SE 学习笔记(五)
- 中国开源基础类库 NDKK 开发进展 2013-10-14
- ORACLE体系结构概述
- 智能指针(Smart Pointer) [一]
- 数据库连接池的配置
- Android开发探秘之四:利用Intent实现数据传递
- 不明觉厉的spring(3)---Aop
- ASP.NET应用程序的生命周期与mvc接入
- Iphone4越狱及无证书真机调试程序
- ASP.NET应用程序的生命周期与mvc接入
- 词法分析程序