"[图片] 练习 3.10: 编写一个非递归版本的 comma 函数,使用 bytes.Buffer 代替字符串链接操作。 解题思路: 参考书中的 comma 函数,即实现基本的为数字添加逗号分隔符 确定了第一个逗号位置后,每隔三个数字添加一个逗号,最后末尾会多出来一个逗号,去掉即可 使用 bytes.Buffe 而非 .."

【go 语言圣经】练习答案 -- 第三章

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

解题思路:

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 函数,以支持浮点数处理和一个可选的正负号的处理。

解题思路:

// 判断是否有正负号
// 判断是否有小数部分
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: 编写一个函数,判断两个字符串是否是是相互打乱的,也就是说它们有着相同的字符,但是对应不同的顺序。

解题思路:

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

感觉第一种方式更加简单粗暴

返回目录

【go 语言圣经】练习答案 -- 目录篇

  • 教程
    70 引用 • 330 回帖 • 3 关注
  • 学习

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

    77 引用 • 267 回帖
  • golang

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

    270 引用 • 1088 回帖 • 768 关注
回帖   
请输入回帖内容...