【九度OJ】题目1126:打印极值点下标 解题报告
【九度OJ】题目1126:打印极值点下标 解题报告
标签(空格分隔): 九度OJ
[LeetCode]
http://ac.jobdu.com/problem.php?pid=1126
题目描述:
在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,
或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。
输入:
每个案例的输入如下:
有2×n+1行输入:第一行是要处理的数组的个数n;
对其余2×n行,第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。
输出:
每个案例输出为n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔。
样例输入:
3
10
10 12 12 11 11 12 23 24 12 12
15
12 12 122 112 222 211 222 221 76 36 31 234 256 76 76
15
12 14 122 112 222 222 222 221 76 36 31 234 256 76 73
样例输出:
0 7
2 3 4 5 6 10 12
0 2 3 10 12 14
Ways
查找题。
这个题我的想法就是很简单的比较当前值与左右值,看是否是极值点。
算法核心很简单,每次出现问题的地方都在输出的格式上。这个题里边,因为每行前后的空格问题出现了两次Presentation Error,这个代表基本正确,但是表达格式略有问题。
我添加了个bool的判断是否是每行的第一个元素来方便判断是否在前面添加一个空格后,这个题就成功的AC了。
另外注意,left值是从-1开始取得,要不然UI一直和cur一样。
#include <stdio.h>
int main() {
int n;
int m;
int buf[80];
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n; i++) {
int left = -1, cur = 0, right = 1;
scanf("%d", &m);
for (int j = 0; j < m; j++) {
scanf("%d", &buf[j]);
}
bool isFirst= true;
while (cur < m) {
if (cur == 0 && buf[cur] != buf[right]) {
printf("%d", cur);
isFirst= false;
} else if (cur == m - 1 && buf[cur] != buf[left]) {
if (isFirst){
printf("%d", cur);
isFirst= false;
}else{
printf(" %d", cur);
}
} else if ((buf[cur] > buf[left] && buf[cur] > buf[right])
||(buf[cur] < buf[left] && buf[cur] < buf[right])) {
if (isFirst){
printf("%d", cur);
isFirst= false;
}else{
printf(" %d", cur);
}
}
left++;
cur++;
right++;
}
printf("\n");
}
}
return 0;
}
Date
2017 年 2 月 27 日