如果具有前任和后继的每个元素要么严格地大于它们中的两个(包括前任和后继者),要么严格地小于它们两者,那么一个一维数组被称为带肋的。对于具有长度n(2 这是我为我的测试用例http://prntscr.com/53zoc3得到的结果。
每次我提交答案时,我都会得到不同的结果,例如第三和第四个案例http://prntscr.com/53zt79。
我只是想知道我是否可以得到我需要解决的第二个案例问题的意见,如果一般我的代码似乎很好。提前谢谢!#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;
}
答案 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");
程序应该结束。