轨道
/
Go
Go
/
练习
/
数列
数列

数列

简单

说明

给定一个数字字符串,按它们出现的顺序输出该字符串中所有长度为 n 的连续子串。

例如,字符串“49142”包含以下 3 位数的序列:

  • “491”
  • “914”
  • “142”

以及以下 4 位数的序列:

  • “4914”
  • “9142”

如果你从一个 5 位数的字符串里要一个 6 位数的序列,那不管得到什么,都是你自找的。

注意,这些序列只要求在输入中占据_相邻的位置_,数字本身不必_在数值上连续_。

实现

定义两个函数:(两个?没错,有时候我们对 Go 的要求就是会多一些。)

All返回一个数组,包含 s 中所有长度为 n 的子字符串。

All(n int, s string) []string

UnsafeFirst返回 s 中第一个长度为 n 的子字符串。

UnsafeFirst(n int, s string) string

到这里,你可以认为这个练习已经完成,接着往下走了。

不过等一下,你可能会问一个很合理的问题:为什么这个函数叫 Unsafe First?如果你感兴趣,就继续往下读,看看附加练习。

附加练习

当go test通过后,试试go test -tags asktoomuch。 这里用了一个_构建标签_来启用之前没有启用的测试。 构建标签可以用来选择包要使用哪些文件。 在我们的例子里,它会控制使用哪些测试文件。 你可以在 Go 文档 中了解更多。

你可能会发现,你没法让这个 asktoomuch 测试通过。 我们需要一种方式来表示:在某些情况下,你无法取字符串的前 N 个字符。 UnsafeFirst做不到这一点,因为它只返回一个字符串。

为了解决这个问题,我们给函数再加一个返回值吧。 定义First(int, string) (first string, ok bool),并用go test -tags first来测试。

ok bool这个第二个返回值是 Go 里常见且地道的写法。 例如,你在 Map 查询 和 类型断言 里都能看到它。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Go Exercism

准备好开始 数列 了吗?

注册 Exercism,借助 34 个概念165 个练习 和真人导师指导,学习并掌握 Go,全部免费。