第三章部分习题
练习 3.10 编写一个非递归的 comma 函数,运用 bytes.Buffer,而不是简单的字符串拼接。
func commaNoRecur(s string) string {
n := len(s)
if n <= 3 {
return s
}
var buf bytes.Buffer
var dot byte = ','
for i := 0; i < n; i++ {
if (n - i) % 3 == 0 && i != 0 {
buf.WriteByte(dot)
}
buf.WriteByte(s[i])
}
return buf.String()
}
练习 3.11 增强 comma 函数的功能,让其正确处理浮点数,以及带有可选正负号的数字。
这里只处理浮点数,正负号可选,再与前面的整合一下便可
func commaFloat(s string) string {
n := len(s)
i := 0
for ; i < n; i++ {
if s[i] == '.' {
break
}
}
var ints, dec string
var FirstIsdigit bool = false
if unicode.IsDigit(rune(s[1])) {
ints = s[0:i]
dec = s[i+1:]
FirstIsdigit = true
} else {
ints = s[1:i-1]
dec = s[i+1:]
}
ints = comma(ints)
n = len(dec)
var buf bytes.Buffer
if n > 3 {
i := 0
for ; i < n && (n-i) > 3; i+=3 {
buf.WriteString(dec[i:i+3])
buf.WriteByte(',')
}
buf.WriteString(dec[i:])
}
dec = buf.String()
var res string = ints + "." + dec
if FirstIsdigit {
return res
} else {
return string(s[1]) + res
}
}
练习 3.12 编写一个函数判断两个字符是否同文异构,也就是,它们都含有相同的字符但排列顺序不同。
func isIsomers(s1, s2 string) bool {
size1 := len(s1)
size2 := len(s2)
if(size1 != size2) {
return false
}
s1Map := make(map[byte]int)
for i := 0; i < size1; i++ {
s1Map[s1[i]]++
s1Map[s2[i]]--
}
for _, s := range s1Map {
if(s != 0) {
return false
}
}
return true
}