Please enable Javascript to view the contents

Golang字符串替换面试题

 ·  ☕ 2 分钟

前言

今天上网浏览网站的时候 , 看到一个一个问题, 问题是这样的 “A、 B 、 C 是 3 个字符串。把 A 中包含的所有 B 都替换为 C ,如果替换以后还有 B 就继续替换,直到 A 不包含 B 为止。
乍一看, 这不是挺简单的么 . 仔细一看, 题目后面还有一行小字

请编写程序实现以上功能。不允许使用系统提供的字符串比较、查找和替换函数。

这就有点意思了, 我们日常编写代码, 字符串查找替换函数使用的都是系统提供的标准方法 , 一点问题都没有, 但如果让我们自己实现一个呢 . 有时候还真不是很简单.

如何实现

要实现替换, 首先要查找到开始替换的位置 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 查找b在a中第一次出现的位置
func index(a,b string) int{
	m,n := len(a),len(b)
	if n == 0 {return 0} // b为空, 则返回0
	if n > m {return -1} // b比a还长, 则返回-1
	for i := 0; i < m-n+1; i++ {
		// 从a的第一位开始, 判断是否有子串和b完全相同, 有的话返回索引位置
		if a[i] == b[0] {
			if a[i:i+n] == b[:]{
				return i
			}
		}
	}
	return -1 // 没有匹配到, 也返回-1
}

ok , 现在位置有了, 我们可以实现将a中的b, 替换成c

1
2
3
4
func replaceIndex(a,b,c string,index int)string{
	n := len(b) // b的长度
	return a[0:index] + c + a[index+n:] // 拼接字符串, 完成替换
}

现在最重要的部分都有了, 可以完成全部的逻辑了, 只需要循环就可以了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func final(a,b,c string)string{
	if index(c,b) > 0 {return ""} // 这里需要注意, 如果c中包含b, 则永远无法完成替换, 这个是错误的
	if index(a,b) > 0 {
		for{
			i := index(a,b)
			if i <= 0 {return a} // 循环到找不到b结束
			a := replaceIndex(a,b,c,i)
		}
	}
	return ""
}

结束

至此就实现了题目中的要求, 其实go的标准库中实现挺复杂的, 考虑到了各种长度字符串的情况, 还使用到了rabin-karp算法 . 可见一个简单的问题, 如果完全不使用库也不是那么容易 .

那么我们写代码需要了解到各种标准库的实现吗 ? 这是个问题 .

分享

三排三号
作者
三排三号
Backend Programmer