剑指 Offer 05. 替换空格

788人浏览 / 0人评论

题目

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:
输入:s = "We are happy."
输出:"We%20are%20happy."

题解

思路一(新建修改)

新建一个[]byte res,用来存储替换之后的字符集,最终再将其转换成string

res初始容量为0

  • 遍历s中的每个字符c
  • 当c为空格时,res向后追加'%' '2' '0'
  • 当c不为空格时,res向后追加c

res初始容量为3 * len(s)

  • res待更新索引pos初始为0
  • 遍历s中的每个字符c
  • 当c为空格时,从res[pos]开始修改为'%' '2' '0',pos += 3
  • 当c不为空格时,res[pos] = c,pos++

思路二(原地修改)

统计s中空格的个数n,将s扩容2 * n,再根据原始长度逆序遍历s将其修改

  • 将s转换成[]byte ss,记录s长度len1
  • 遍历s中每个字符c,当c为空格时,n++
  • ss后追加2 * n个字符,记录ss当前长度len2
  • 以i=len1-1逆序遍历ss中的每个字符cc
  • 当cc不为空格时,ss[len2-1] = ss[i],len2--
  • 当cc为空格时,将ss的[len2-3,len2-1]修改为'%' '2' '0',len2 -= 3
  • 如果i==len2-1,说明左侧已无空格,跳出循环

代码

新建修改-1

func replaceSpace(s string) string {
	res := make([]byte, 0)
	for i := range s {
		if s[i] == ' ' {
			res = append(res, '%', '2', '0')
		} else {
			res = append(res, s[i])
		}
	}
	return string(res)
}

新建修改-2

func replaceSpace(s string) string {
	res := make([]byte, len(s)*3)
	var pos int = 0
	for i := range s {
		if s[i] == ' ' {
			res[pos] = '%'
			res[pos+1] = '2'
			res[pos+2] = '0'
			pos += 3
		} else {
			res[pos] = s[i]
			pos++
		}
	}
	return string(res[0:pos])
}

原地修改

func replaceSpace2(s string) string {
	ss := []byte(s)
	len1 := len(s)
	var n int = 0
	for i := 0; i < len1; i++ {
		if ss[i] == ' ' {
			n++
		}
	}
	temp := make([]byte, n*2)
	ss = append(ss, temp...) // 扩容
	len2 := len(ss)

	for i := len1 - 1; i >= 0; i-- {
		if len2-1 == i {
			break
		}
		if ss[i] == ' ' {
			ss[len2-1] = '0'
			ss[len2-2] = '2'
			ss[len2-3] = '%'
			len2 -= 3
		} else {
			ss[len2-1] = ss[i]
			len2 -= 1
		}
	}
	return string(ss)
}

全部评论