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)
}

关键修改:

  1. 正确计算所有面的表面积:2*l*w + 2*w*h + 2*h*l
  2. 只添加最小面的面积一次作为额外包装纸:l * w(因为sides已经排序,sides[0]*sides[1]就是最小面)
  3. 添加了对空行的检查,避免解析错误

这样计算出来的总面积应该就是正确的答案。

回到顶部