牛客网第96题:有序序列判断

目录

思路1

思路2

代码实现


要求:输入一个序列,判断是否是有序,有序指:从小到大有序或者从大到小有序即可。对于相同的值,认为是有序的。

目的:如果有序,输出sorted;否则,输出unsorted

对于有序序列的要求:

序列长:0~50     序列中数值:3~100

思路1

一般情况下,我们希望是邻近元素两两比较,然后分别进入两个循环,这两个循环分别为判断降序和升序的循环,一旦进入循环,如果不是所有元素比较完,才出循环,则认为一定不是有序序列。

思路2

但是对于思路一过于繁琐,空间复杂度会很高,所以我们这里提出另一种思路:

第一步:我们可以设置两个标杆flag1和flag2,初始值为 0,然后在两相邻两元素比较之后,如果前面元素大于后面,则flag1赋值为 1,反之flag2 赋值为1。然后一直重复比较相邻两元素,直到所有元素比较完事。

第二步:最后,当所有元素比较完事之后,判断flag1与flag2的和是否是 2,如果是,就说明这一序列中的元素,不是升序或者降序,而是乱序的;如果不是,就说明,每次比较一直都是改变其中一个的值,所以是有序的。

代码实现

#include<stdio.h>
int main()
{
	int i = 0;
	int j = 0;
	int flag1 = 0;
	int flag2 = 0;
	int arr[50] = { 0 };
	int n = 0;
	scanf("%d",&n);
	for (i = 0; i < n; i++)
	{
		scanf("%d",&arr[i]);
		if (i > 0)
		{
			if (arr[i] > arr[i - 1])
				flag1 = 1;
			else
				flag2 = 1;
		}
	}
	if (flag1 + flag2 == 2)
		printf("unsorted");
	else
		printf("sorted");
	return 0;
}

然后,这里还需要注意的是,标杆外层的 if 语句,其实有没有都是一样的。因为这个判断是为了防止出现序列中只有一个数的情况,但是其实如果只是一个数,那么我们认为其应该是有序的。

本文到此就结束啦,如有错误,还请指正呀!

牛客网第96题:有序序列判断

上一篇:给请求接口写一个回调函数


下一篇:UBUNTU18.04安装ROS melodic