题目:一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置, 即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。 如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 要移动数据次数最少,而且不允许使用另外数组,如果真的移动数组元素的话, 无法实现(排除使用单个变量存储的情况)。 所以想到循环队列(数据结构),只是移动头指针,加上取余,就可以实现。 代码实现: #include<iostream> using namespace std; #define N_MAX 105 int main() { int a[N_MAX]; int n,m; cin>>n>>m; for(int i=0;i<n;i++){ cin>>a[i]; } a[n]=a[0];//为了方便下面取余时出现0的情况 m=m%n; for(int i=0;i<n;i++){ int t=(n-m+i)%n;//i用来实现打印循环,观察可以知道m和头 //指针指向元素下标的关系t=n-m(这里用到上面的a[n]=a[0]) if(i==n-1){ cout<<a[t]<<endl; } else{ cout<<a[t]<<" "; } } return 0; }
自测03—数组元素循环右移问题
最新推荐文章于 2021-01-25 13:16:16 发布