思路:将每一个元素历遍,若比旁边的元素大,则返回下标
难点:1,可能存在多个峰值,所以最好用数组存储(注意在函数中要在存储的数组前加上static)
static int z[] = { 0 };
2,注意头与尾
if (i == 0)
{
if (x[i] > x[i + 1])
{
z[j] = i;
j++;
}
}
if (i == y - 1)
{
if (x[i] > x[i - 1])
{
z[j] = i;
j++;
}
}
3,不好输入任意长度数组,并且输入值为非负,所以我们用-1截断,然后取前面的元素即可
int i;
i = 0;
static int nums[] = { 1 };
while (nums[i - 1] != -1)
{
scanf("%d", &nums[i]);
i++;
}
int n = i - 1;
最终代码如下:
#include <stdio.h>
void find_peak(int* x, int y)
{
int i, j;
j = 0;
static int z[] = { 0 };
for (i = 0; i < y; i++)
{
if (i == 0)
{
if (x[i] > x[i + 1])
{
z[j] = i;
j++;
}
}
if (i > 0 && i < y - 1)
{
if (x[i] > x[i - 1] && x[i] > x[i + 1])
{
z[j] = i;
j++;
}
}
if (i == y - 1)
{
if (x[i] > x[i - 1])
{
z[j] = i;
j++;
}
}
}
for (i = 0; i < j; i++)
{
printf("%d ", z[i]);
}
}
int main()
{
int i;
i = 0;
static int nums[] = { 1 };
while (nums[i - 1] != -1)
{
scanf("%d", &nums[i]);
i++;
}
int n = i - 1;
int a[] = { 0 };
find_peak(nums, n);
return 0;
}