《go语言圣经》练习答案--第三章

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

func comma(s string) string {
	n := len(s)
	if n <= 3 {
		return s
	}
	var buf bytes.Buffer
	quotient := n / 3
	remainder := n % 3
	buf.WriteString(s[:remainder])
	for i := 0; i < quotient; i++ {
		start := remainder + i*3
		end := start + 3
		buf.WriteString(",")
		buf.WriteString(s[start:end])
	}
	return buf.String()
}

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

func comma(s string) string {
	var buf bytes.Buffer
	//符号部分处理
	var symbol byte
	if s[0] == '-' || s[0] == '+' {
		symbol = s[0]
		s = s[1:]
	}
	buf.WriteByte(symbol)

	ss := strings.Split(s, ".")
	//整数部分
	integer := ss[0]
	n := len(integer)
	quotient := n / 3
	remainder := n % 3
	buf.WriteString(s[:remainder])
	for i := 0; i < quotient; i++ {
		start := remainder + i*3
		end := start + 3
		buf.WriteString(",")
		buf.WriteString(s[start:end])
	}
	//小数部分
	if len(ss) > 1 {
		buf.WriteString(".")
		buf.WriteString(ss[1])
	}

	return buf.String()
}

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

func isHaveEqualChar(s1, s2 string) bool {
	if len(s1) != len(s2) {
		return false
	}
	m1 := make(map[rune]int)
	for _, v := range s1 {
		m1[v] += 1
	}
	for _, v := range s2 {
		if _, ok := m1[v]; ok {
			m1[v]--
		} else {
			return false
		}
		if m1[v] < 0 {
			return false
		}
	}
	for _, v := range m1 {
		if v > 0 {
			return false
		}
	}
	return true
}

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

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

 

posted @ 2022-03-17 15:21  随风而逝的白色相簿  阅读(238)  评论(0编辑  收藏  举报