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()
}
View Code

练习 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()
}
View Code

练习 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"
	}
}
View Code

 

posted @ 2019-01-21 15:35  on-way  阅读(505)  评论(0编辑  收藏  举报