您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页[LeetCode By Go 44]506. Relative

[LeetCode By Go 44]506. Relative

来源:华佗小知识

题目

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)
    }
}

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务