📅  最后修改于: 2023-12-03 15:31:05.618000             🧑  作者: Mango
HackerRank GoLang: Bon Appétit 是一道 HabitRank 平台上关于 Go 语言练习的题目。本题考查了以下知识点:
题目链接:https://www.hackerrank.com/challenges/bon-appetit/problem
题目描述:
Anna 和 Brian 前往一家餐厅共进晚餐,账单总额为 $n$。Anna 决定她将支付 $k$ 元,剩余的费用将由 Brian 支付。Brian 热情地同意了。Anna 告诉您菜单项目,其价格已如下所示:
bill = [2, 4, 6, 8]
如果 Anna 选择删除 Brian 的食品账单中的第 $k$ 项,则 Brian 将支付的价格为何?
例如,Anna 把 $bill$ 中的第 2 项删除。 $bill = [2, 6, 8]$ 。她的分摊费用为 $\frac{(2 + 6 + 8)} {2} = 8$,而 Brian 应支付 $4$ 元。如果她没有删除任何项,她将支付 $2 + 4 + 6 + 8 = 20$。 Brian 会为其余菜单项目支付 $\frac{20}{2} = 10$。如果他支付的价格为 $$ 5$ 而不是 $$ 4$,则她将向他支付 $$ 1$。如果他支付得正确,打印 "Bon Appetit"(字面含义:“好胃口”)。否则,打印他应该向她支付多少钱。
请你帮助 Anna 计算应该输出什么内容。
函数接口如下:
// bill: 包含每个项目的整数数组
// k: Anna 清除的项目索引
// b: Anna 实际支付的费用
// 如果 Brian 没有支付错误,则返回“Bon Appetit”,否则返回应支付的金额。
func bonAppetit(bill []int32, k int32, b int32) string {
}
第一行包含两个整数 $n$ 和 $k$,分别表示菜单项目数量和 Anna 选择删除的项目索引。
第二行包含 $n$ 个整数,表示每个 $bill_i$ 的值。
第三行包含一个整数 $b$,表示 Anna 实际支付的费用。
如果 Brian 没有支付错误,则打印 "Bon Appetit"(字面含义:“好胃口”);否则,打印他应该向她支付多少钱。
4 1
3 10 2 9
12
5
首先,我们需要遍历切片求出总和。遍历切片的方式有多种,本题我们选择使用 Go 语言的 range
关键字来遍历切片。
然后,我们需要根据删除第 $k$ 项后的账单总费用和 Anna 实际支付的费用 $b$ 求出 Brian 需要支付的费用。如果他支付的费用与正确的金额不同,则需要向 Anna 支付差价。
在 Go 中,常用的条件语句有 if-else
和 switch-case
。本题我们选择使用 if-else
语句来实现。
func bonAppetit(bill []int32, k int32, b int32) string {
var sum int32
for _, v := range bill {
sum += v
}
sum = (sum - bill[k]) / 2
if sum == b {
return "Bon Appetit"
} else {
return strconv.Itoa(int(b - sum))
}
}
在上述代码中,我们使用了 Go语言的 strconv
包将整数转换为字符串返回。返回的字符串格式满足要求,可以直接用于打印。
本题考查了 Go 语言的切片、遍历、数学运算和条件语句等知识点。在解题过程中,我们使用了 Go 语言的 range
关键字遍历切片,使用了 if-else
条件语句判断 Brian 支付的费用是否正确,并使用了 strconv
包将整数转换为字符串。