需求
跳水比賽,有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