题解 | #有序序列判断#
有序序列判断
https://www.nowcoder.com/practice/22e87f8a8d764a6582710f38d1b40c6e
#include <stdio.h>
int main() {
int t;
scanf("%d",&t);
int prev = 0;
int cur = 0;
int flag = 1;
int tmp = 0;
for(int i=0;i<t;i++)
{
scanf("%d",&cur);
if(i==1){
tmp = cur-prev;
}
else{
int prevf = tmp >> 31;
tmp = cur-prev;
int curf = tmp >> 31;
if(!(prevf==0&&curf==0||prevf&&curf))
{
printf("unsorted\n");
flag = 0;
break;
}
}
prev = cur;
}
if(flag) printf("sorted\n");
return 0;
}
解题思路:
序列有序 可以是单调递增 也可以是单调递减
那么就只用将相邻元素的增量保存起来 下一次计算增量时比较与这个增量的符号 如果都是为正/负 则说明单调性仍然成立, 如果符号一正一负 那么单调性将不再成立 结束循环
那么怎么知道上次的增量与这次的增量符号是否相同呢,这里可以根据补码的性质,正数符号位为0,负数符号位为1,0和0与得到0,0和1与得到0, 1和1与得到1, 那么我们首先判断是否两个符号位都为0 如果是这种情况 那么也是单调性成立 除此之外 如果两个符号位相与结果为0 那么就说明单调性不成立 退出循环
查看15道真题和解析