Golang编程艺术:2015年代码问题探讨
Golang编程艺术:2015年代码问题探讨
package main
import (
"io/ioutil"
"strings"
"strconv"
"sort"
)
func main(){
input, err := ioutil.ReadFile("./inputtext.txt")
if err != nil {
panic(err)
}
presents := strings.Split(string(input), "\n")
total := 0
for _, present := range presents{
sides := []int{}
for _, sideString := range strings.Split(present, "x"){
side, _ := strconv.Atoi(sideString)
sides = append(sides, side)
}
sort.Ints(sides)
total += 3 * sides[0] * sides[1]
total += 2 * sides[1] * sides[2]
total += 2 * sides[0] * sides[2]
}
println(total)
}
各位,这是关于2015年代码艺术第二天问题的第一部分。我认为我的代码是正确的,但网站一直提示答案太小。请检查我的代码是否存在任何问题。
更多关于Golang编程艺术:2015年代码问题探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
你能提供问题描述的链接吗?
从代码来看,你的输入似乎是类似3x5x4这样的格式,然后你计算了334+245+235,但很难判断这是否符合题目要求。
更多关于Golang编程艺术:2015年代码问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
为什么不根据字符串分割的长度来设置容量(当然要在循环外提取为变量),然后使用索引呢?每次向切片追加元素时,如果容量不足(这里初始容量为零!),就需要花费额外时间为新元素分配空间并重新赋值。
strings.Split(present, "x")
你的代码计算礼物包装纸面积时存在逻辑错误。问题在于你重复计算了某些面的面积。
根据问题描述,包装纸总面积应该是:
- 所有面的面积之和:
2*l*w + 2*w*h + 2*h*l - 加上最小面的面积作为额外包装纸:
min(l*w, w*h, h*l)
在你的代码中,你使用了:
total += 3 * sides[0] * sides[1] // 这相当于计算了最小面3次
total += 2 * sides[1] * sides[2] // 中等面和最大面的乘积
total += 2 * sides[0] * sides[2] // 最小面和最大面的乘积
正确的计算方式应该是:
package main
import (
"io/ioutil"
"strings"
"strconv"
"sort"
)
func main() {
input, err := ioutil.ReadFile("./inputtext.txt")
if err != nil {
panic(err)
}
presents := strings.Split(string(input), "\n")
total := 0
for _, present := range presents {
if present == "" {
continue // 跳过空行
}
sides := []int{}
for _, sideString := range strings.Split(present, "x") {
side, _ := strconv.Atoi(sideString)
sides = append(sides, side)
}
sort.Ints(sides)
l, w, h := sides[0], sides[1], sides[2]
// 计算表面积
surfaceArea := 2*l*w + 2*w*h + 2*h*l
// 加上最小面的面积作为额外包装纸
extra := l * w
total += surfaceArea + extra
}
println(total)
}
关键修改:
- 正确计算所有面的表面积:
2*l*w + 2*w*h + 2*h*l - 只添加最小面的面积一次作为额外包装纸:
l * w(因为sides已经排序,sides[0]*sides[1]就是最小面) - 添加了对空行的检查,避免解析错误
这样计算出来的总面积应该就是正确的答案。

