检查阵列是否有棱纹

时间:2014-11-07 18:41:22

标签: c arrays

如果具有前任和后继的每个元素要么严格地大于它们中的两个(包括前任和后继者),要么严格地小于它们两者,那么一个一维数组被称为带肋的。对于具有长度n(2

#include <stdio.h>

 int main ()
 {

     int n, i, j;
     int check=0;
     scanf ("%d", &n);
     if (n<2 || n>100)
     {
         printf("Invalid input");
     }
     j=n;
     int m[j];

         for (j=0; j<n; j++)
         {
             scanf ("%d", &m[j]);

         }
         for (i=0; i<n-2; i++)
         {
             if ( ( ( m[i] < m[i+1] ) && ( m[i+1] > m[i+2] ) )  ||  
             ( ( m[i] > m[i+1] ) && ( m[i+1] < m[i+2] ) ) )
         {
               check=1;
         }
              else check=0;

         }


     if (check==1 )
         {
             printf ("YES");
         }
     else if (check==0)
         {
             printf ("NO");
         }

     return 0;



 }

这是我为我的测试用例http://prntscr.com/53zoc3得到的结果。 每次我提交答案时,我都会得到不同的结果,例如第三和第四个案例http://prntscr.com/53zt79。 我只是想知道我是否可以得到我需要解决的第二个案例问题的意见,如果一般我的代码似乎很好。提前谢谢!

2 个答案:

答案 0 :(得分:2)

只有通过检查数组的最后一个(但是一个)元素来设置for循环后,问题是check。但早期的元素可能无法通过罗纹测试。

如果循环中的任何元素未通过“罗纹”测试,则需要停止测试更多元素,因为您知道此时阵列没有肋状。

因此在失败案例中添加一个中断:

for (i = 0; i < n - 1; i++) {
    if (((m[i] < m[i + 1]) && (m[i + 1] > m[i + 2]))
            || ((m[i] > m[i + 1]) && (m[i + 1] < m[i + 2]))) {
        check = 1;
    } else {
        check = 0;
        break;
    }
}

答案 1 :(得分:1)

首先,我没有看到数组的初始化位置。

其次,你试图在循环中访问数组之外​​的内存。

for (i = 0; i < n - 1; i++) {
    if (((m[i] < m[i + 1]) && (m[i + 1] > m[i + 2]))
            || ((m[i] > m[i + 1]) && (m[i + 1] < m[i + 2]))) {
        check = 1;
    } else
        check = 0;
}

如果i等于n - 2,则m[i+2]将等同于m[n]。但是,有效的指数范围是0, n - 1

如果check设置为0,你还需要中断循环。

如果输入不满足条件

if (n < 2 || n > 100)
    printf("Invalid input");

程序应该结束。