数组元素移动
来源:互联网 发布:大学生开淘宝网店 编辑:程序博客网 时间:2024/06/05 19:16
描述
试设计一个算法,将数组a中的元素a[0]至a[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)。
输入
先输入一个大于1且小于100的正整数n,再输入n个整数存到数组a中,最后输入一个小于n正整数k,
输出
循环移动k位后输出。
输入样例
5
2 6 15 39 5
3
2 6 15 39 5
3
输出样例
15
39
5
2
39
5
2
6
算法:
1、将整个数组置换(a[i]<=>a[n-1-i])
2、将前k个数置换
3、将后n-k个数置换
要点:
对于a[i],第一次交换后为a[n-1-i],成为后n-k个数,第二次交换后为a[k+i],向右移动(k+i)-i = k位;
对于a[n-1-i],第一次交换后为a[i],成为前k个数,第二次交换后为a[k-1-i],向右移动(n-1-(n-1-i))+(k-1-i+1)=k位;
#include <iostream>#include <cstdio>using namespace std;//交换void Swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp;}void Reverse(int *a, int *b){ //地址比较 while(a < b) Swap(a++, b--);}void Shift(int a[], int k, int n){ Reverse(a, a+n-1); //全部交换 Reverse(a, a+k-1); //前k个交换 Reverse(a+k, a+n-1); //剩下部分交换}int main(){ int a[100], n, k; scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &a[i]); scanf("%d", &k); Shift(a, k, n); for(int i = 0; i < n; i++) printf("%d%c", a[i], i != n-1 ? ' ':'\n'); return 0;}
1 0
- 循环移动数组元素
- 移动数组中的元素
- 数组元素移动
- 数组元素的上下移动
- 使用memcpy进行数组元素移动
- 谷歌面试题:数组元素移动交叉
- 谷歌面试题:数组元素移动交叉
- 谷歌面试题:数组元素移动交叉
- 【HUSTOJ】1079: 数组元素的移动
- 数组元素的移动(方法优化)
- 数组元素的移动(补充)
- 小算法--数组中元素的移动
- js实现数组元素上下移动
- 将数组中指定数量的元素移动数组后面
- 将数组非零元素依次移动到数组前端
- 数组移动 数组元素循环右移问题
- 微软面试题目(二)移动数组元素
- 3-32 推箱子(数组元素移动)
- 虚拟按键遮挡app页面,如华为荣耀7i
- 聚集索引和非聚集索引(整理)
- 使用httpclient必须知道的参数设置及代码写法、存在的风险
- 基于Jedis实现Redis分片的理解
- Jedis分片连接池(分布式)
- 数组元素移动
- 远程调用服务(RPC)和消息(Message Queue)对比及其适用/不适用场合
- 硬件中断、软件中断的定义
- Android四大组件之 BroadcastReceiver
- AMQP协议(经典)
- 对象比较类
- 搭建NFS文件服务器
- Raft一致性算法
- 四层和七层负载均衡的区别