题解 | #有序序列判断#

有序序列判断

https://www.nowcoder.com/practice/22e87f8a8d764a6582710f38d1b40c6e

官方给出的答案存在问题:我们自测输入

3

3 3 4

输出结果为:unsorted

代码出现的问题在:

for(int j=2;j<n;++j)
    {
        if(a[1]>a[0])//判断开头是升还是降,进入if表示是升序
        {
            if(a[j]<a[j-1])//如果有不符合的
            {
                cout<<"unsorted";//则不是有序的
                break;
            }
            else if(j==n-1)//一直到最后都是符合的
                cout<<"sorted";//则整个数组都是升序,输出有序
        }
        else//如果开头是降序
        {
          if(a[j]>a[j-1])//有相邻元素不满足降序排列
        {
            cout<<"unsorted";//则不是有序的
            break;
        }
        else if(j==n-1 )//一直到最后,整个数组都是降序的
            cout<<"sorted";//输出有序
        }

我们看 输入数组为时3 3 4。

首先会进行判断a[1]>a[0]不成立,进入else中进行循环判断,a[j]>a[j-1]即4 >3,显然成立,输出unsorted,但实际上3 3 4是有序数组,所以出现问题。

#include<stdio.h>
int main() {
    int arr_val[50];
    int N;
    int flag = 0;
    int start = 0;
    scanf("%d", &N);
    if (N < 3 || N > 50) {
        return 0;
    }
    for (int i = 0; i <= N - 1; i++) {
        scanf("%d", &arr_val[i]);
    }

    if (arr_val[0] <= arr_val[1]) { //升序
        for (int i = 0; i <= N - 2; i++) {
            if (arr_val[i] <= arr_val[i + 1]) {
                flag = 1;
            } else {
                flag = 0;
                break;
            }
        }
    }
    if (arr_val[0] >= arr_val[1] && flag == 0) { //逆序

        for (int i = 0; i <= N - 2; i++) {
            if (arr_val[i] >= arr_val[i + 1]) {
                flag = 1;
            } else {
                flag = 0;
                break;
            }
        }
    }

    if (flag == 0) {
        printf("unsorted");
    } else if (flag == 1) {
        printf("sorted");
    }
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务