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