需求
跳水比赛,有 8个评委 打分,采用切尾均值法求最终得分, 请打印打分 最高和最低 的分数并找出 最佳评分和最差评分 。
- 切尾均值法:去掉1个最高分,去掉1个最低分,剩下的分数除以6,求平均分。
- 最佳评分:最接近最终得分的
- 最差评分:和最终得分相差最大的
Golang代码:
package main
import (
"fmt"
"math"
"math/rand"
"time"
)
// 分数数组长度
const arrLen = 8
// 平均分差值数组长度
const diffLen = arrLen - 2
func main() {
// 生产随机分数
scores := randScore()
// 排序
sort(&scores)
// 通过切片去掉最高分和最低分
slice := scores[1:arrLen-1]
// 求平均分
avg := avg(slice)
fmt.Printf("原始分数:%v\n切头去尾:%v\n",scores,slice)
fmt.Printf("最高分:%v,最低分:%v ,切尾均值:%v\n",scores[arrLen - 1],scores[0],avg)
// 求最佳最差, 相同的分数以头一个为准
find(slice,avg)
}
// 查找最佳和最差评分, 思路:求绝对值,比大小
func find(slice []int, avg int){
// 定义一个绝对值数组,来存放分数和最终得分的差值的绝对值
absArr := [diffLen]float64{}
for i, v := range slice {
absArr[i] = math.Abs(float64(v - avg))
}
//fmt.Println("评分差:",absArr)
minIndex,maxIndex := findMaxAndMinByFloat(&absArr)
fmt.Printf("最佳评分:%v,最差评分:%v\n",slice[minIndex], slice[maxIndex])
}
// 找出最大值和最小值及其下标
func findMaxAndMinByFloat(arr *[diffLen]float64)(int,int) {
len := len(arr)
max := 0.0
maxIndex := 0
min := arr[len - 1]
minIndex := len - 1
for i := 0; i < len; i++ {
for j,v := range arr{
if v > max {
max = v
maxIndex = j
}
if v < min {
min = v
minIndex = j
}
}
}
//fmt.Printf("最大值:%v,下标是:%v\n",max,maxIndex)
//fmt.Printf("最小值:%v,下标是:%v\n",min,minIndex)
return minIndex,maxIndex
}
// 排序
func sort(arr *[arrLen]int){
for i := 0; i < arrLen - 1; i++ {
for i := 0; i < len(arr)-1; i++ {
curr := arr[i]
next := arr[i+1]
if curr > next {
arr[i+1] = curr
arr[i] = next
}
}
}
}
// 求平均数
func avg(slice []int) int{
sum := 0
for _,v := range slice{
sum += v
}
avg := sum / len(slice)
return avg
}
// 产生1~100随机数的数组
func randScore()[arrLen]int{
rand.Seed(time.Now().UnixNano())
arr := [arrLen]int{}
for i := range arr{
arr[i] = rand.Intn(100)
}
return arr
}
输出:
原始分数:[6 50 56 58 63 88 88 89]
切头去尾:[50 56 58 63 88 88]
最高分:89,最低分:6 ,切尾均值:67
最佳评分:63,最差评分:88