啊我摔倒了..有没有人扶我起来学习....
题目
问:输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)
数据范围: 3 ≤ n ≤ 50
序列中的值都满足 1 ≤ val ≤ 100
输入描述:
第一行输入一个整数N(3 ≤ N ≤ 50)
第二行输入N
个整数,用空格分隔N
个整数
输出描述:
输出为一行,如果序列有序输出sorted
,否则输出unsorted
示例
输入5
1 6 9 22 30
输出sorted
解法
1. 确定思路
- 首先要考虑到,如果数列中的每个数相等,也算是有序数列
- 我们直接比较相邻元素,如果先增后减或者,先减后增这种不单调的数列就不是有序的,但是这样判断有点难度
- 所以我们反过来考虑,我就假设你是一直增的,左边就是一直比右边小的,假如
10
个元素,比较其实就是9
次,这9
次都是左边小于等于右边。如果最终结果表明,这个次数小于9
次,说明就不是升序的 - 降序同理
2. 编写代码
- 按照上述的思路,先设计主函数部分。用一个数组接收输入的序列
int n;
scanf("%d", &n);
int arr[n];
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int sz = sizeof(arr) / sizeof(arr[0]);
- 为了代码可读性强,把判断是否有序的功能封装成一个函数,并判断返回值
int result = judge_sorted(arr, sz);
if (result)
printf("sorted\n");
else
printf("unsorted\n");
- 函数实现部分采用上述思路,假设数列是升序(或降序),用
count
记录比较次数(符合升序或降序才记录)
int count1 = 0;
int count2 = 0;
for (int i = 0; i < sz - 1; i++)
{
if (arr[i] <= arr[i + 1])
count1++;
if (arr[i] >= arr[i + 1])
count2++;
}
- 当比较完所有元素后就会退出循环,这时就该判断
count
是否满足次数要求了
if ((count1 == (sz - 1)) || (count2 == (sz - 1)))
return 1;
else
return 0;
- 试试看最终的功能: