PTA 数组去最值
比赛成绩中“去掉一个最高分,去掉一个最低分”常有。编写函数,对传入的指定长度的指定数组进行去最值处理(去掉一个最大和一个最小值,其它元素保持相对不变),删除最值时需要移动元素(后边的元素要前移),要求采用高效算法:移动元素尽量少的元素,因为最大最小值是两个,故原来的数组长度自然是减少了两个,主调函数自知,你不用返回删除后的长度,但是,要求删除函数返回总的移动次数(以测试你是不是以最少的移动完成)。
函数接口
int delMaxMin(int A[],int n);
输入样例
10
9 3 8 3 3 9 8 5 8 8
输出样例
{9,3,8,3,8,5,8,8}
4
#include<stdio.h>
#include<stdlib.h>
int delMaxMin(int A[],int n){
int count=0;
int mz,my;//用于记录最左值和最右值的最值的下标,
int max=A[0],min=A[0];
for(int i=0;i<n;i++){
if(max<=A[i]){
max=A[i];
mz=i;
}
if(min>=A[i]){
min=A[i];
my=i;
}
}
//对数组重新排序,先处理最左侧的最值
int temp;
if(my > mz){
temp = mz;
mz = my;
my = temp;
}//将最左侧的最值与右侧的最值之间的数进行移动,并记录移动次数
for(int i=my+1;i<mz;i++){
A[i-1] = A[i];
count++;
}//将最右侧的最值后的数移动
for(int j=mz+1;j<n;j++){
A[j-2] = A[j];
count++;
}
return count;
}