C语言每日练习题——No.18 , 有序序列的判断

题目链接:

有序序列判断_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/22e87f8a8d764a6582710f38d1b40c6e?tpId=107&tags=&title=96&difficulty=&judgeStatus=&rp=0&gioEnter=menu

解题思路

1. 首先要明白有序的概念是什么,有序即指一行数字从小到大排列,

或者是从大到小排列

或是这一行数字均相等

所以,有序一共有上述三种情况

2. 因为题目要求是判断输入的一行数字是否是有序的,

所以根据有序的三种情况,我们可以想到用 if 语句来作为整体的大框架

3. 然后将思路集中到每一种情况上来,其中关键的一点是要先根据一行数字中俩个数字的有序情况作为初步的估计,这里我选定第一个数字,与最后一个数字(实际上,任选俩个也都可以)

因为如果这个序列是有序的,则任意按顺序取出俩个数字则是符合这种有序情况的

4. 一种常见的错误思路是:

设置一个中间变量,如果在遍历的过程中找到不是有序的数字时,这个变量的值就会为 0,如果是有序时,则这个变量的值为 1

这样做实际上是忽略了这个中间变量的值在找到不符合数字时到整行数字遍历完成之前,它的值还会被覆盖,所以这个思路并不符合程序员给出的所有数列,只有特定的数列才会满足这个错误的思路

错误代码(正确代码在文末):

#include <stdio.h>
int main ()
{
    int data = 0;
    scanf("%d\n",&data);
    int arr[50] = {0};
    int i = 0;
    for (i = 0;i < data;i++)
    {
        scanf("%d ",&arr[i]);  //输入
    }
    
    if(arr[data-1] - arr[0] > 0)  //判断是否为升序
    {
        int m = 0;
        int change = 0;
        for (m = 0;m < data-1;m++)
        {
            if (arr[m+1] - arr[m] > 0)
            {
                change = 1;
            }
            else
                change = 0;
        }
        if (change == 1)
            printf("sorted\n");
        else
            printf("unsorted");
    }
    
    else if (arr[data-1] - arr[0] < 0)//判断是否为降序
    {
        int n = 0;
        int change2 = 0;
        for (n = 0;n < data-1;n++)
        {
            if (arr[n+1] - arr[n] < 0)
            {
                change2 = 1;
            }
            else
                change2 = 0;
        }
        if (change2 == 1)
            printf("sorted\n");
        else
            printf("unsorted");        
    }
    
    else if (arr[data - 1] == arr[0]) //判断是否相等
    {
         int x = 0;
        int change3 = 0;
        for (x = 0;x < data-1;x++)
        {
            if (arr[x+1] == arr[x] )
            {
                change3 = 1;
            }
            else
                change3 = 0;
        }
        if (change3 == 1)
            printf("sorted\n");
        else
            printf("unsorted");   
        
    }
    return 0;
}

正确代码:

#include <stdio.h>
int main ()
{
    int data = 0;
    scanf("%d\n",&data);
    int arr[50] = {0};
    int i = 0;
    for (i = 0;i < data;i++)
    {
        scanf("%d ",&arr[i]);  //输入
    }
    
    if(arr[data-1] - arr[0] > 0)  //判断是否为升序
    {
        int m = 0;
        int change = 0;
        for (m = 0;m < data-1;m++)
        {
            if (arr[m+1] - arr[m] < 0)
            {
                printf("unsorted");
                return 0;
            }
            else
                change = 1;
        }
       if (change == 1)
           printf("sorted");
    }
    
    else if (arr[data-1] - arr[0] < 0)//判断是否为降序
    {
        int n = 0;
        int change2 = 0;
        for (n = 0;n < data-1;n++)
        {
            if (arr[n+1] - arr[n] > 0)  //
            {
               printf("unsorted");         新
                return 0 ;                 的
                                           思
                                           路
            }
            else
                change2 = 1;
        }
        if (change2 == 1)
            printf("sorted\n");       //
    }
    
    else if (arr[data - 1] == arr[0]) //判断是否相等
    {
         int x = 0;
        int change3 = 0;
        for (x = 0;x < data-1;x++)
        {
            if (arr[x+1] != arr[x] )
            {
                printf("unsorted");
                return 0;
            }
            else
                change3 = 1;
        }
        if (change3 == 1)
            printf("sorted\n");   
        
    }
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值