【牛客刷題】HJ68 成績排序

題目鏈接

這題本身就是一個排序題,按照學生成績排序,成績一樣的按照輸入的前後順序排。

如果用Java,那麼利用ArrayList能很輕鬆的完成:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int a = in.nextInt();
            int b = in.nextInt(); // 0 or 1
            List<Student> list = new ArrayList<>();
            for (int i = 0; i < a; i++) {
                Student student = new Student(in.next(), in.nextInt());
                list.add(student);
            }

            if (b == 1) {
                list.sort(Comparator.comparingInt(Student::getGrade));
            }
            if (b == 0) {
                list.sort((o1, o2) -> o2.getGrade() - o1.getGrade());
            }

            list.forEach(System.out::println);
        }
    }
}

class Student {
    private String name;

    private int grade;

    public Student(String name, int grade) {
        this.name = name;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return this.name + " " + this.grade;
    }
}

但是實際執行時間不容樂觀,要169ms。換成Go試試看,實際上也是定義一個數據結構,但是這裏要注意一點,一定要加上index表示輸入順序,事實上Java幫我們做了好多事情,一旦換了別的語言要首先適應自己的事情自己做:

package main

import (
	"fmt"
	"sort"
)

type Grade struct {
	name  string
	score int
	index int
}

func main() {
	num := 0
	fmt.Scan(&num)

	flag := 0
	fmt.Scan(&flag)

	var grades []*Grade

	for i := 0; i < num; i++ {
		name := ""
		score := 0
		fmt.Scan(&name, &score)
		grades = append(grades, &Grade{name, score, i})
	}

	if flag == 0 {
		sort.Slice(grades, func(i, j int) bool {
			if grades[i].score == grades[j].score {
				return grades[i].index < grades[j].index
			}
			return grades[i].score > grades[j].score
		})
	} else {
		sort.Slice(grades, func(i, j int) bool {
			if grades[i].score == grades[j].score {
				return grades[i].index < grades[j].index
			}
			return grades[i].score < grades[j].score
		})
	}
	for _, v := range grades {
		fmt.Printf("%s %d\n", v.name, v.score)
	}
}

實際執行時間6ms,真棒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章