报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

.
.
.
.
.
  • 1 被读作 "one 1" ("一个一") , 即 11。
  • 11 被读作 "two 1s" ("两个一"), 即 21。
  • 21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

输入:
输出: ""
输入:
输出: ""
理解题意:

首先我们还是列举一下每个数的输出吧

第几次 输出
1 1
2 11
3 21
4 1211
5 111221
6 312211
7 13112221
8 1113213211
9 31131211131221

从上面我们可以看出来,对一个数说出来有两种情况:

  • 多个相邻一样:n个几
  • 相邻不一样:1个几
那函数中重要的思想就是:
  1. 遍历上一次的输出
  2. 然后比较相邻的数
  3. 如果是一样的话,那就在找下一位
  4. 如果是不一样的话,那就要添加到数组中
核心代码:
func say(bs []byte) []byte {
result := make([]byte, )
x, y := ,
for x < len(bs) { //取出字节数组中的每一个
//判断相邻位置的是否是一样
//当是一样的话,那就继续,找到有多少个是一样的
//当不是一样的话,那就是一个几
//这里要保证y不能超过bs的长度,不然会panic
for y < len(bs) && bs[x] == bs[y] {
y++
}
//第二个参数是指有多少个一样的
// (这里需要注意一点,一定要加上'0',不然字节不对,'0'代表的字节是48,
// 如果不加上'0',byte(y-x)就是byte(1),这是不对的)
//第三个参数是指说出来的那个数
result = append(result, byte(y-x+''), bs[x]) //跳过相同的数
x = y
}
return result
}

当然我们肯定要一开始就设定第一次的输出为'1'

func countAndSay(n int) string {
if n == {
return ""
}
bs := []byte{''}
for i := ; i <= n; i++ {
bs = say(bs)
}
return string(bs)
}

为什么要用字节数组呢?因为转字符串简单呀!!!

最新文章

  1. 问题记录:JavaFx 鼠标滑轮滚动事件监听!
  2. String和StringBuffer
  3. angularJs的ui-router总结
  4. 【Anagrams】 cpp
  5. c++基础语法 构造函数 析构函数 类的组合
  6. jquery去除字符串首尾空格的方法:$.trim()
  7. 使用pycharm+pyqt5 触发自定义方法
  8. Acer VN7 Win10小键盘修改
  9. iOS OC Swift3.0 TableView 中tableviewcell的线左边不到边界
  10. HandsonTable日期控件的汉化
  11. [JSOI 2011]分特产
  12. html+css手机端自动适应
  13. pycharm设置主题
  14. 模块cv2的用法
  15. 图片文字css小知识点
  16. java学习-- equals和hashCode的关系
  17. Django-Model操作数据库(增删改查、连表结构)
  18. 基于flex的不定个数的按钮组
  19. vue项目ide(vue项目环境搭建)
  20. OpenCV 视频处理框架

热门文章

  1. rsync算法原理和工作流程分析
  2. Spring之IOC容器
  3. loggin(日志模块)
  4. SQL Server 中的 NOLOCK 到底是什么意思?
  5. 解决SQL Server 2008安装时提示:重新启动计算机 失败
  6. java中的序列化
  7. 近期ASP.NET问题汇总及对应的解决办法
  8. C# Why does '+' + a short convert to 44
  9. inheritPrototypeChain.js
  10. idea not found for the web module