打印极值点下标(北大复试上机)

前言:

21考研,不论能否进复试记录一下准备路上写下的垃圾代码。本来啃《算法笔记》,但是感觉太多了做不完,改做王道机试指南。

题目描述:

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

输入描述

第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。

输出描述:

每个案例输出为n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔。

解答

#include<iostream>
#include<algorithm>
#include<vector>
#include<stdio.h>
using namespace std;

vector<int> find_exm(vector<int> vi) {
    
    		//返回极值点向量
	vector<int> res;
	int temp;
	if (vi[0] != vi[1]) {
    
    
		temp = 0;
		res.push_back(temp);
	}
	for (int i = 1; i < vi.size() - 1; i++) {
    
    
		if ((vi[i] > vi[i - 1] && vi[i] > vi[i + 1]) || (vi[i] < vi[i - 1] && vi[i] < vi[i + 1])) {
    
    
			temp = i;
			res.push_back(temp);
		}
	}
	if (vi[vi.size()-1] != vi[vi.size()-2]) {
    
    
		temp = vi.size()-1;
		res.push_back(temp);
	}
	return res;
}
int main()
{
    
    	
	int n,temp;

	while (scanf("%d", &n) != EOF) {
    
    
		vector<int> vi;
		vector<int> res;
		for (int i = 0; i < n; i++) {
    
    
			scanf("%d", &temp);
			vi.push_back(temp);
		}
		res = find_exm(vi);
		for (int i = 0; i < res.size(); i++)
			printf("%d ", res[i]);
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44897291/article/details/112789373