go 语言圣经练习解答 -- 第三章

本贴最后更新于 1679 天前,其中的信息可能已经时移世改

go 语言圣经(The Go Programming Language)第三章练习题答案

前言

go 语言圣经是一本 go 入门非常不错的书籍,翻译至 The Go Programming Language,本文记录该书章节后练习题答案

练习 3.10: 编写一个非递归版本的 comma 函数,使用 bytes.Buffer 代替字符串链接操作。

解题思路:

  • 参考书中的 comma 函数,即实现基本的为数字添加逗号分隔符
  • 确定了第一个逗号位置后,每隔三个数字添加一个逗号,最后末尾会多出来一个逗号,去掉即可
  • 使用 bytes.Buffe 而非"+"
func comma(s string) string {
    var buffer bytes.Buffer
    l := len(s)

    for i := 0; i < len(s); i++ {
        buffer.WriteString(string(s[i]))
	// 取余3可以得到第一个插入逗号的位置,后面依次+3即可,末尾不加","
        if (i+1)%3 == l%3 {  if (i+1)%3 == l%3 && i != l-1 { 
            buffer.WriteString(",")
        }
    }

    s = buffer.String()
    return s
}

练习 3.11: 完善 comma 函数,以支持浮点数处理和一个可选的正负号的处理。

解题思路:

  • 将整数部分分离处理处理即可,整树部分与 3.10 相同
  • 首先判读第一个字符是否为"+/-",如果是,将符号添加到 buffer 中,然后去掉原字符串的第一个字符。
  • 通过小数点将字符串分隔为两个数组,下标为 0 的为整数部分,如果存在小数点则下标为 1 的为小数部分
  • 处理完整数部分后判断是否存在小数部分,存在着添加到 buffer 中
// 判断是否有正负号
// 判断是否有小数部分
func comma(s string) string {

	var buffer bytes.Buffer

	// 获取正负号
	if s[0] == '-' || s[0] == '+' {
		// 将符号添加到返回的字符串中
		buffer.WriteByte(s[0])
		s = s[1:]
	}

	// 分离整数部分与小数部位
	arr := strings.Split(s, ".")
	s = arr[0]
	l := len(s)

	// 格式整数部分
	for i := 0; i < len(s); i++ {
		buffer.WriteString(string(s[i]))
		// 取余3可以得到第一个插入逗号的位置,后面依次+3即可,末尾不加","
		if (i+1)%3 == l%3 && i != l-1 {
			buffer.WriteString(",")
		}
	}

	// 存在小数部分
	if len(arr) > 1 {
		buffer.WriteString(".")
		buffer.WriteString(arr[1])
	}

	s = buffer.String()
	return s // 末尾会多一个逗号,去掉 + "." + arr[1]
}

练习 3.12: 编写一个函数,判断两个字符串是否是是相互打乱的,也就是说它们有着相同的字符,但是对应不同的顺序。

解题思路:

  • 拥有相同字符那么他们长度肯定是相同的
  • 每个字符都有自己的 Unicode 码,记录每个字符串中每个字符出现的次数
  • 循环记录的数组,对比个数是否相同
func isReverse(a, b string) bool {
	// 长度不一样直接返回false
	if len(a) != len(b) {
		return false
	}
	// 用于记录每个字符串出现的次数
	m := make(map[rune]int)
	n := make(map[rune]int)
	// 以字符串Unicode码作为map的Key
	for _, v := range a {
		m[v]++
	}
	for _, v := range b {
		n[v]++
	}
	// 判断相同下标值是否相同
	for i, v := range m {
		if n[i] != v {
			return false
		}
	}
	return true
}

练习 3.13: 编写 KB、MB 的常量声明,然后扩展到 YB。

1.简单粗暴法(没有解题思路)

const (
	KB = 1000
	MB = KB * KB
	GB = MB * KB
	TB = GB * KB
	PB = TB * KB
	EB = PB * KB
	ZB = EB * KB
	YB = ZB * KB
)

2.结合书中例子定义 KiB 到 YiB 解决

KiB = 1024,       KB = 1000
MiB = 1048576,    MB = 1000000
GiB = 1073741824, GB= 1000000000
...
  • KiB 减去 24 就是 KB
  • MIB 减去 48576 就是 MB
  • ...
const (
	_   = 1 << (10 * iota)
	KiB // 1024
	MiB // 1048576
	GiB // 1073741824
	TiB // 1099511627776 (exceeds 1 << 32)
	PiB // 1125899906842624
	EiB // 1152921504606846976
	ZiB // 1180591620717411303424 (exceeds 1 << 64)
	YiB // 1208925819614629174706176
)
const (
	KB = 1000
	MB = MiB - MiB%(KB*KB)
	GB = GiB - GiB%(MB*KB)
	TB = TiB - TiB%(GB*KB)
	PB = PiB - PiB%(TB*KB)
	EB = EiB - EiB%(PB*KB)
	ZB = ZiB - ZiB%(EB*KB)
	YB = YiB - YiB%(ZB*KB)
)

感觉第一种更加简单粗暴

返回目录

  • 教程
    139 引用 • 496 回帖 • 7 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    161 引用 • 473 回帖
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    492 引用 • 1383 回帖 • 370 关注
1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...