来源于牛客
第一次看这道题的时候感觉很简单,没有想太多,就简单判断了数字的递增和递减,若 n = 1则输出为 - 1 这两种情况,这样的思考显然过于浅显;
浅显在于:
1.又双叒叕没仔细看好题,题目说的是错误输入情况都输出 - 1 ,而我第一次写的代码是 n = 1 的时候输出才为 - 1;而且题目是从第零天开始算的,我自动脑补为了第一天;
2.(和第一点相照应)如果我 n = 1 的时候输入的情况是 0 or 15 呢?那很显然接下来的数就有着明确的递增递减变化,我们可以单独对这种情况进行讨论;
3.突然想到的一种情况,如果我们输入了一串递增 or 递减的数列,但是其最后一位值为 15 or 0,如此看来,其下一位数应该是递减 or 递增的,但是用之前的代码运行的话,我们的程序只能辨别其是递增或递减,从而导致判断的错误,所以我们针对此情况还要另外讨论;
以下是我给出的答案:
#include<stdio.h>
int main()
{
int day[101] = { 0 };
int n;
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &day[i]);
if (day[i] > 15 || day[i] < 0) goto out;
if (n == 1) {
if (day[i] == 0) { printf("UP"); return 0; }
if (day[i] == 15) { printf("DOWN"); return 0; }
}
while (i >= 2) {
if ((day[i] + 1 == day[i - 1]) || (day[i] - 1 == day[i - 1])) break;
else goto out;
}
while (i == n) {
if (day[i] == 0) {
printf("UP"); return 0;
}
if (day[i] == 15) {
printf("DOWN");
return 0;
}
break;
}
}
if (day[n] > day[n - 1] && n > 1) printf("UP");
else if (day[n] < day[n - 1] && n>1) printf("DOWN");
else out : printf("-1");
return 0;
}
这个答案显然是不怎么满意的,但是目前也没想出更好的解决方法;
显然想要学会巧妙的解法,不能只会平铺直叙;
从这题中我还了解到了 return 0 可以直接结束整个程序,之前只是见到别人用过,但并不怎么了解(我是笨蛋),在我自己写的时候,因为很多地方的判断若是生效接可以直接结束程序了,但我也不会多个 goto 的用法,所以我就考虑有没有一种可以直接结束程序的办法,那么我们平时是怎么结束程序的呢,是 return 0 ,那我在这个地方也使用一个 return 0 可以吗,实践是检验真理的唯一标准,这显然是可以的,哈哈,也许这只是一个很小的方面吧,但我也觉得有所收获。
看来还是得多动手,多试试。