[LeetCode By Go 44]506. Relative Ranks

题目

Given scores of N athletes, find their relative ranks and the people with the top three highest scores, who will be awarded medals: “Gold Medal”, “Silver Medal” and “Bronze Medal”.

Example 1:

Input: [5, 4, 3, 2, 1]
Output: [“Gold Medal”, “Silver Medal”, “Bronze Medal”, “4”, “5”]
Explanation: The first three athletes got the top three highest scores, so they got “Gold Medal”, “Silver Medal” and “Bronze Medal”.
For the left two athletes, you just need to output their relative ranks according to their scores.

Note:

  1. N is a positive integer and won’t exceed 10,000.
  2. All the scores of athletes are guaranteed to be unique.

解题思路

  1. 复制nums到一个新数组numsSort,进行逆序排序,则新字符串对应的rank即为Gold Medal Silver Medal Bronze Medal 4 5 …
  2. 建立一个map,存储score和rank的对应关系
  3. 按照nums的顺序,将rank append到结果数组中

注意
数组‘=’赋值的是地址

考虑边界情况

  1. 输入数组大小为0,输出为空
  2. 输入数组大小为1,输出为[]string{“Gold Medal”}

代码

findRelativeRanks.go

package _506_Relative_Ranks

import (
    "sort"
    "strconv"
    "fmt"
)
type IntSlice []int

func (s IntSlice) Len() int { return len(s) }
func (s IntSlice) Swap(i, j int){ s[i], s[j] = s[j], s[i] }
func (s IntSlice) Less(i, j int) bool { return s[i] > s[j] }

func FindRelativeRanks(nums []int) []string {
    len1 := len(nums)
    if 0 == len1 {
        return []string{}
    }else if 1 == len1{
        return []string{"Gold Medal"}
    }

    var rank []string

    var numsSorted []int
    numsSorted = make([]int , 0, len1)
    for _, v := range nums {
        numsSorted = append(numsSorted, v)
    }
    sort.Sort(IntSlice(numsSorted))
    fmt.Printf("sort:%+v\n", numsSorted)
    fmt.Printf("nums:%+v\n", nums)

    var rankMap map[int]string
    rankMap = make(map[int]string)

    if len1 >= 2 {
        rankMap[numsSorted[0]] = "Gold Medal"
        rankMap[numsSorted[1]] = "Silver Medal"
    }

    if len1 >= 3 {
        rankMap[numsSorted[2]] = "Bronze Medal"
        for i := 3; i < len1; i++ {
            rankMap[numsSorted[i]] = strconv.Itoa(i+1)
        }
    }

    fmt.Printf("rankMap:%+v\n", rankMap)


    for i := 0; i < len1; i++ {
        rank = append(rank, rankMap[nums[i]])
    }

    return rank
}

测试

findRelativeRanks_test.go

package _506_Relative_Ranks

import "testing"

func TestFindRelativeRanks(t *testing.T) {
    var tests = []struct{
        input []int
        output []string
    }{
        {[]int{10,3,8,9,4}, []string{"Gold Medal","5","Bronze Medal","Silver Medal","4"}},
        {[]int{}, []string{}},
        {[]int{3}, []string{"Gold Medal"}},
        {[]int{3, 2, 1}, []string{"Gold Medal","Silver Medal","Bronze Medal"}},
        {[]int{5,4,3,2,1}, []string{"Gold Medal","Silver Medal","Bronze Medal","4","5"}},
    }

    for _, test := range tests {
        ret := FindRelativeRanks(test.input)

        t.Logf("want:%+v\n, get:%+v\n", test.output, ret)
    }
}
    原文作者:miltonsun
    原文地址: https://www.jianshu.com/p/001575faf6c7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞