问题 B: 打印极值点下标

题目描述

在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。

输入

每个案例的输入如下:

有2×n+1行输入:第一行是要处理的数组的个数n;
对其余2×n行,第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。

输出

每个案例输出不多于n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔,如果没有极值点则不输出任何东西。

样例输入 Copy

2
4
1 2 1 3
5
3 4 5 6 7

样例输出 Copy

0 1 2 3
0 4

这是比较常规的写法:第一个和最后一个单独判断,

#include<cstdio>
const int maxn = 90;
int main(){
	int a[maxn];
	int n,m,h;
	while(scanf("%d",&n)!=EOF){
		while(n--){
			scanf("%d",&m);
			for(int i=0;i<m;i++){
				scanf("%d",&a[i]);
			}
			if(a[0]!=a[1]) printf("0 ");
			for(int i=1;i<m-1;i++){
				if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1]))
					printf("%d ",i);
			}	
			if(a[m-1]!=a[m-2]) printf("%d\n",m-1);			
			//printf("\n");
		}	
	}	
	return 0;
}

这个是比较有灵性的一种写法:秒处在于使用了一个flag作为标记判断前面是否有极值,从而决定是否输出空格。

#include <iostream>
using namespace std;

int main()
{
    int n, k;
    while (cin >> n)
    {
        while (n--)
        {
            cin >> k;
            int A[k], flag = 0; // flag标记是否存在极值,也标记在某个元素前是否已经有极值输出过了
            for (int i = 0; i < k; ++i)
                cin >> A[i];
            if (A[0] != A[1]) // 数组头尾元素单独判断
                cout << 0, flag = 1;
            for (int i = 1; i < k - 1; ++i)
            {
                if ((A[i] > A[i - 1] && A[i] > A[i + 1]) ||(A[i] < A[i - 1] && A[i] < A[i + 1]))
                {
                    if (flag) // flag为1表明在A[i]前有输出,所以要跟空格
                        cout << ' ';
                    cout << i, flag = 1;
                    ;
                }
            }
            if (A[k - 1] != A[k - 2]) // 题目保证了k>4,所以不用担心不存在k - 2
            {
                if (flag)
                    cout << ' ';
                cout << k - 1, flag = 1;
            }
            if (flag)
                cout << endl;
        }
    }
}
发布了19 篇原创文章 · 获赞 2 · 访问量 745

猜你喜欢

转载自blog.csdn.net/zan1763921822/article/details/104298726