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" } }