题解 | #成绩排序#
成绩排序
https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
"strings"
)
type Student struct {
Name string
Record int
Index int
}
type StudentSlice []Student
func (x StudentSlice) Len() int { return len(x) }
func (x StudentSlice) Less(i, j int) bool {
if x[i].Record == x[j].Record {
return x[i].Index < x[j].Index
}
return x[i].Record < x[j].Record
}
func (x StudentSlice) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
func main() {
var n, sortFlag int
if _, err := fmt.Scan(&n); err != nil {
return
}
if _, err := fmt.Scan(&sortFlag); err != nil {
return
}
var studentSlice = make([]Student, 0)
scanner := bufio.NewScanner(os.Stdin)
for i := 0; i < n; i++ {
for scanner.Scan() {
str := scanner.Text()
strSli := strings.Fields(str)
if len(strSli) != 2 {
return
}
var cur Student
var err error
cur.Index = i
cur.Name = strSli[0]
if cur.Record, err = strconv.Atoi(strSli[1]); err != nil {
return
}
studentSlice = append(studentSlice, cur)
break
}
}
if sortFlag == 0 {
sort.Slice(studentSlice, func(i, j int) bool {
if studentSlice[i].Record == studentSlice[j].Record {
return studentSlice[i].Index < studentSlice[j].Index
}
return studentSlice[i].Record > studentSlice[j].Record
})
} else if sortFlag == 1 {
sort.Sort(StudentSlice(studentSlice))
} else {
return
}
for _, val := range studentSlice {
fmt.Printf("%s %d\n", val.Name, val.Record)
}
}