go语言圣经练习
练习 3.10: 编写一个非递归版本的comma函数,使用bytes.Buffer代替字符串链接操作。
package main
import (
"fmt"
"os"
"bytes"
)
func main() {
for i := 1; i < len(os.Args); i++ {
fmt.Printf("%s\n", comma(os.Args[i]))
}
}
func comma(s string) string {
var buf bytes.Buffer
n := len(s)
for i := n; i > 0 ; i-- {
buf.WriteByte(s[n-i])
if i % 3 == 1 && i > 3 {
buf.WriteString(",")
}
}
return buf.String()
}
练习 3.11: 完善comma函数,以支持浮点数处理和一个可选的正负号的处理。
package main
import (
"fmt"
"os"
"bytes"
"strings"
)
func main() {
for i := 1; i < len(os.Args); i++ {
fmt.Printf("%s\n", comma(os.Args[i]))
}
}
func comma(s string) string {
var buf bytes.Buffer
n := len(s)
m := strings.IndexAny(s, ".")
for i := n; i > 0 ; i-- {
buf.WriteByte(s[n-i])
if (m == -1 && i % 3 == 1 && i > 3) || ( m != -1 && i % 3 == 1 && i > n-m+1) {
buf.WriteString(",")
}
}
return buf.String()
}
练习 3.12: 编写一个函数,判断两个字符串是否是是相互打乱的,也就是说它们有着相同的字符,但是对应不同的顺序。
package main
import (
"fmt"
"os"
"strings"
)
func main() {
fmt.Println(upset(os.Args[1], os.Args[2]))
}
func upset(a, b string) string {
c := a + b
n := len(a)
j := 0
for i :=0; i < n; i++ {
if strings.Count(a, a[i:i+1]) == strings.Count(c, a[i:i+1])/2 {
j++
}
}
if !strings.EqualFold(a, b) && j == n {
return "YES"
} else {
return "NO"
}
}
浙公网安备 33010602011771号