PAT (Basic Level) Practice 1008 数组元素循环右移问题

一、概述

1008很经典的循环右移问题,主要是oj上有几个坑可以记录下来看看。

循环右移一般就是倒过来,倒过来再倒过来,很简单,但是会有一些小地方让你没法子达到满分,这就很蛋疼。

二、分析

如果仅仅只是反转三次,五个样例只能对两个。还有三个是错的。

1、右移为0。

直接通过判断进行输出。

if (m == 0)
{
	i = 0;
	while (i + 1 != n)
	{
	    printf("%d ", a[i]);
		i++;
	}
	printf("%d", a[i]);
}

2、右移大于数组元素总数,即需要循环右移。

通过取模来模拟循环。

Reserve(a, 0, n - m % n - 1);
Reserve(a, n - m % n, n - 1);
Reserve(a, 0, n - 1);

3、只有一个元素。

通过判断调用参数的正负来分别处理。

if (head < 0 || end < 0 || (end - head) < 0)
	return;

都是很简单的问题,只是不容易把所有情况都想到。我是一步一步把这三个问题试出来的。应该还有更好的代码。

三、总结

对于输入元素个数为0,为1,大于总个数等情况要注意,一般在原有基础上打个补丁就好了,但是会导致代码很臃肿,显得智商不是那么高。还可以选择不改变原来的数组,而是改变输出的顺序,这也是可以的。

PS:代码如下:

#include<stdio.h>
void Reserve(int *a, int head, int end)
{
	if (head < 0 || end < 0 || (end - head) < 0)
		return;
	int ex;
	int i;
	for (i = 0; i <= (end - head) / 2; i++)
	{
		ex = a[head+i];
		a[head + i] = a[end - i];
		a[end - i] = ex;
	}
}
int main()
 {
	int n, m;
	scanf("%d%d", &n, &m);
	int a[100];
	int i = 0;
	while (i != n)
	{
		scanf("%d", &a[i]);
		i++;
	}
	if (m == 0)
	{
		i = 0;
		while (i + 1 != n)
		{
			printf("%d ", a[i]);
			i++;
		}
		printf("%d", a[i]);
	}
	else
	{
		Reserve(a, 0, n - m % n - 1);
		Reserve(a, n - m % n, n - 1);
		Reserve(a, 0, n - 1);
		i = 0;
		while (i + 1 != n)
		{
			printf("%d ", a[i]);
			i++;
		}
		printf("%d", a[i]);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值