【golang】strings.Builder的使用

一、背景

每日一题:1807. 替换字符串中的括号内容

二、解答

1. 自解:

func evaluate(s string, knowledge [][]string) string {
	// knowledge存map
	knowMap := map[string]string{}
	for _, kv := range knowledge {
		knowMap[kv[0]] = kv[1]
	}
	// 遍历字符串s
	index := 0
	ans := ""
	for index < len(s) {
		// 如果等于(,开始遍历查找
		if s[index] == '(' {
			index++
			word := ""
			for index < len(s) {
				if s[index] == ')' {
					if knowMap[word] == "" {
						ans += "?"
					} else {
						ans += knowMap[word]
					}
					break
				}
				word += string(s[index])
				index++
			}
		}
		// 如果等于(,开始遍历查找
		if s[index] == ')' {
			index++
			continue
		}
		// 其他字符直接添加
		if index < len(s) {
			ans += string(s[index])
			index++
		} else {
			break
		}

	}
	return ans
}

2. 官方题解

func evaluate1(s string, knowledge [][]string) string {
	// knowledge存map
	knowMap := map[string]string{}
	for _, kv := range knowledge {
		knowMap[kv[0]] = kv[1]
	}
	// 遍历字符串s
	ans := &strings.Builder{}
	start := -1
	for i, c := range s {
		if c == '(' {
			start = i
		} else if c == ')' {
			if t, ok := knowMap[s[start+1:i]]; ok {
				ans.WriteString(t)
			} else {
				ans.WriteString("?")
			}
			start = -1
		} else if start < 0 {
			ans.WriteRune(c)
		}
	}
	return ans.String()
}

三、总结

1. 自解与官解整体思路一直,具体实现不同。

  1. 我是采用索引加两重循环去处理,实际也是一次遍历
  2. 官方采用标识符来判断是括号内与括号外,再去处理。

2. 学习

  1. strings.Builder的使用
// 定义
ans := &strings.Builder{}
// 添加字符串
ans.WriteString(t)
// 添加字符串中的字符
ans.WriteRune(c)
// 转化为字符串
ans.String()
  1. 使用for range去处理效率较高,也不用担心越界
for i, c := range s {
}
  1. 处理map是否存在对应的值的时候,可以用ok去判断。我是使用题干条件+零值去判断的。
if t, ok := knowMap[s[start+1:i]]; ok {
	ans.WriteString(t)
} else {
	ans.WriteString("?")
}
  1. 截取字符串的时候直接使用切片
s[start+1:i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值