Go语言字符串字符计数实战:分金币游戏
使用Go语言编写程序,根据名字中包含的特定元音字母数量计算每个人应分配的金币总数,并统计剩余金币。
问题描述
假设你有50枚金币需要分配给一组特定的用户。分配规则基于他们名字中包含的元音字母(不区分大小写)进行计算:
- a. 名字中包含
e或E,每人得 1 枚金币; - b. 名字中包含
i或I,每人得 2 枚金币; - c. 名字中包含
o或O,每人得 3 枚金币; - d. 名字中包含
u或U,每人得 4 枚金币。
请编写一个程序,计算每个用户分配到多少金币,以及最后总共剩下多少金币?
准备工作
确保你的开发环境中已安装并配置好 Go 语言环境。本示例将使用标准库 fmt 和 strings。
第1步:定义数据结构
首先,我们需要定义全局变量来存储金币总数、所有用户的名单列表,以及用于记录每个人的金币数量的字典(Map)。
var (
coins = 50 // 初始金币总数
users = []string{
"Matthew", "Sarah", "Augustus", "Heidi", "Emilie",
"Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
}
distribution = make(map[string]int) // 用于存储 {用户名: 金币数} 的映射
)
第2步:实现金币分配核心逻辑
创建 dispatchCoin 函数。该函数遍历所有用户名字,利用 strings.ContainsAny 函数检测是否存在对应的元音字母,并根据规则累加金币,同时从总额中扣除。
func dispatchCoin() int {
for _, name := range users {
// a. 检查是否有 e/E
if strings.ContainsAny(name, "eE") {
distribution[name]++
}
// b. 检查是否有 i/I
if strings.ContainsAny(name, "iI") {
distribution[name] += 2
}
// c. 检查是否有 o/O
if strings.ContainsAny(name, "oO") {
distribution[name] += 3
}
// d. 检查是否有 u/U
if strings.ContainsAny(name, "uU") {
distribution[name] += 4
}
// 从总金币池中扣除当前人分得的金币
coins -= distribution[name]
}
return coins
}
注意:上述代码中的 `distribution` 会在每次迭代时更新。在 `main` 函数中我们会输出完整的结果。
第3步:运行并打印结果
在 main 函数中调用分配逻辑,然后逐个打印每个用户的姓名及其所得金币,最后输出剩余的金币数。
func main() {
left := dispatchCoin()
for _, name := range users {
fmt.Printf("%s: %d\n", name, distribution[name])
}
fmt.Println("剩下:", left)
}
完整代码
将上述片段组合在一起即可运行:
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)
)
func dispatchCoin() int {
for _, name := range users {
if strings.ContainsAny(name, "eE") {
distribution[name]++
}
if strings.ContainsAny(name, "iI") {
distribution[name] += 2
}
if strings.ContainsAny(name, "oO") {
distribution[name] += 3
}
if strings.ContainsAny(name, "uU") {
distribution[name] += 4
}
coins -= distribution[name]
}
return coins
}
func main() {
left := dispatchCoin()
for _, name := range users {
fmt.Printf("%s: %d\n", name, distribution[name])
}
fmt.Println("剩下:", left)
}
运行效果验证
执行上述程序后,终端输出的结果如下:
- Matthew: 1 (含E)
- Sarah: 0 (无匹配元音)
- Augustus: 4 (含U)
- Heidi: 3 (含I)
- Emilie: 3 (含E, I)
- Peter: 1 (含E)
- Giana: 2 (含I)
- Adriano: 5 (含I, O)
- Aaron: 3 (含A? 不,规则仅限e,i,o,u。这里需再核查。原文示例为3。让我们看 Aaron: A-a-r-o-n。原代码逻辑是只查 e,E,i,I,o,O,u,U。所以 Aaron 有 'a' 不计分,有 'o' 计3分。正确。)
- Elizabeth: 3 (含E, i)
- 剩余金币: 25
D:\Software\godata\src\1201>go run main.go
Matthew: 1
Sarah: 0
Augustus: 4
Heidi: 3
Emilie: 3
Peter: 1
Giana: 2
Adriano: 5
Aaron: 3
Elizabeth: 3
剩下: 25
以上就是基于Go语言的字符串查找与逻辑运算的详细内容,更多关于Go字符串技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













