题解 | #非递减序列#
非递减序列
https://www.nowcoder.com/practice/752409657fee4fddbac587fb30fd59b6
// 遍历整数序列,看当前数字是否小于等于它后面的那个数
#include <stdio.h>
int main() {
int arr[10000] = { 0 };
int count = 0;
while (scanf("%d", &arr[count]) != EOF) {
++count;
}
// 输入完毕,开始处理
int flag = 0; // 修改次数的计数器
for (int i = 0; i < count - 1 && flag <= 1; ) {
// 如果第一个数大于第二个数,则将第一个数改为和第二个数相等
if (i == 0 && arr[i] > arr[i + 1]) {
arr[i] = arr[i + 1];
++i; // 向后递增1,开始判断下一个数字
++flag; // 做出了一次修改,修改次数计数器要递增1
} else if (arr[i] > arr[i + 1]) { // 在非第一个数的位置发生了降序
arr[i] = arr[i - 1]; // 让当前的数等于它的前一个数,
++flag; // 做出了一次修改,修改次数计数器要递增1
// 此时不要改变i的值,因为下一次循环还要检查这个改完之后的数是否还是比后面的数大,
// 即该数的前一个数可能比后一个数大,比如6,5,4这种情况,将5改为6之后仍然比后面的4大,
// 是因为5前面的6大于5后面的4
} else { // 非降序时直接递增i,判断下一个数字即可
++i;
}
}
// 循环结束有可能是因为i=count-1 (此时说明可以只修改一次),也可能是因为flag=2 (说明修改次数超过限制了)
// i的递增和flag的递增只有当i为0时才会一起进行,因此i=count-1和flag=2不可能同时发生,两个等式只有一个成立
if (flag > 1)
printf("0");
else
printf("1");
return 0;
}
