[Go] 分金币题

·  阅读 155

你有50枚金币,需要分配给以下几个人:
Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。
分配规则如下:
a. 名字中每包含1个'e'或'E'分1枚金币
b. 名字中每包含1个'i'或'I'分2枚金币
c. 名字中每包含1个'o'或'O'分3枚金币
d: 名字中每包含1个'u'或'U'分4枚金币
写一个程序,计算每个用户分到多少金币,以及最后剩余多少金币?

package main

import (
   "fmt"
   "strings"
)

var (
   // 总金币
   coins = 50

   // 所有用户
   users = []string{
      "Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
   }

   // 用户金币计数定义
   distribution = make(map[string]int, len(users))

   // 奖励规则
   rules = map[string]int{"e": 1, "i": 2, "o": 3, "u": 4}
)

func main() {
   left := dispatchCoin(users, rules, coins)
   fmt.Println("剩下:", left)
   fmt.Println(distribution)
}

func dispatchCoin(users []string, rules map[string]int, coins int) int  {
   for _,value := range users {
      for rk,rv := range rules {
         // 转小写
         tolower := strings.ToLower(value)

         // 返回字符串 tolower 中有几个不重复的 rk 子串
         // 获取奖励规则中字母出现的次数
         c := strings.Count(tolower, rk)

         if c == 0 || coins < (c*rv) {
            continue
         } else {
            // 总金币数减少
            coins -= c*rv

            // 用户金币持有计数
            distribution[value] += c*rv
         }
      }
   }
   return coins
}
复制代码
分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改