Go语言字符串字符计数实战:分金币游戏

Ivy
Ivy
发布时间:2026-10-15 | 5人浏览过
原创

使用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字符串技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表