1008 数组元素循环右移问题

这段时间单链表用顺手了,就用单链表存储要右移的数组元素

分析
这道题的核心问题是数组A右移M个位置时,这M个位置上的数据元素如何存储。在不允许使用另外数组的前提下,我想到的是用单链表来存储,简单,方便。

在这里插入图片描述
思路:
①把M个位置的数组元素先保存起来
②右移前n-m个元素
③把①中保存的元素重新放回数组。

1.保存M个位置上的数组元素
n-m的下标准开始,向右依次保存

node* head = NULL,*p1 = head, *p2 = NULL;//head为头结点,p1,p2循环遍历结点
for(i = n - m;i < n;i++){//保存右移的数 
		p1 = new node;
		p1->data = a[i];
		p1->next = NULL;
		if(!head) head = p1;
		else p2->next = p1;
		p2 = p1;
	} 

2.右移

a[n-1] = a[n-m-1];
a[n-2] = a[n-m-2];
......
a[n-i] = a[n-i-m];
......
a[m] = a[0];

所以

	if(m != 0){//m=0的时候不做无谓的移动
		for(i = 1;i <= n - m;i++) //右移 
			a[n - i] = a[n - m - i];
	}

3.数组元素放回
放回时要放在数组下标为0......m-1的数组元素中。

	p1 = head,p2 = p1;
	for(i = 0;i < m;i++){//将最后M个数循环移至最前面的M个位置 
		a[i] = p1->data;
		p1 = p2->next;
		delete p2;
		p2 = p1;
	}

到这里,还不能直接输出,我们只考虑到了n >= m的情况,那么,对于n < m 呢?
一般来说,n < m时直接退出程序就可以了,但是pat测试点1,2过不了,所以要对于这种情况,不能简单粗暴的return 0,我们需要m = m % n,这个是参考博主-打孔猿的博客文章的。

	if(n < m) m = m % n;

此时,我们的程序终于完成了,接下来直接输出就可以了

for(i = 0;i < n - 1;i++) cout<<a[i]<<' ';
cout<<a[i]<<endl;

完整的程序代码

#include<iostream>
using namespace std;
struct node{
	int data;
	node* next;
};

int main(){
	int m,n;
	cin>>n>>m;
	
	if(n < m) m = m % n;
	
	int* a=new int[n];
	int i;//计数
	for(i = 0;i < n;i++) cin>>a[i];
	
	node* head = NULL,*p1 = head, *p2 = NULL;
	for(i = n - m;i < n;i++){//保存右移的数 
		p1 = new node;
		p1->data = a[i];
		p1->next = NULL;
		if(!head) head = p1;
		else p2->next = p1;
		p2 = p1;
		} 
	
	if(m != 0){
		for(i = 1;i <= n - m;i++) //右移 
			a[n - i] = a[n - m - i];
	}
	
	p1 = head,p2 = p1;
	for(i = 0;i < m;i++){//将最后M个数循环移至最前面的M个位置 
		a[i] = p1->data;
		p1 = p2->next;
		delete p2;
		p2 = p1;
	}
//输出 
	for(i = 0;i < n - 1;i++) cout<<a[i]<<' ';
	cout<<a[i]<<endl;
	
	delete []a;
}
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值