2021-02-05:给定一个数N,想象只由0和1两种字符,组成的所有长度为N的字符串。如果某个字符串,任何0字符的左边都有1紧

福大大架构师每日一题 发表于 2021/02/05 22:14:49 2021/02/05
【摘要】 2021-02-05:给定一个数N,想象只由0和1两种字符,组成的所有长度为N的字符串。如果某个字符串,任何0字符的左边都有1紧挨着,认为这个字符串达标。请问有多少达标的字符串?福哥答案2021-02-05:举例:N=6[1 0 1 0 1 0][1 0 1 0 1 1][1 0 1 1 0 1][1 0 1 1 1 0][1 0 1 1 1 1][1 1 0 1 0 1][1 1 0 1 ...

2021-02-05:给定一个数N,想象只由0和1两种字符,组成的所有长度为N的字符串。如果某个字符串,任何0字符的左边都有1紧挨着,认为这个字符串达标。请问有多少达标的字符串?

福哥答案2021-02-05:
举例:
N=6
[1 0 1 0 1 0]
[1 0 1 0 1 1]
[1 0 1 1 0 1]
[1 0 1 1 1 0]
[1 0 1 1 1 1]
[1 1 0 1 0 1]
[1 1 0 1 1 0]
[1 1 0 1 1 1]
[1 1 1 0 1 0]
[1 1 1 0 1 1]
[1 1 1 1 0 1]
[1 1 1 1 1 0]
[1 1 1 1 1 1]
总共13种。

这道题是斐波那契数列。代码不用斐波那契数列,用递归最直观。

代码用golang编写,代码如下:

```go
package main

import "fmt"

func main() {
    for i := 1; i <= 10; i++ {
        ret := ff(i)
        fmt.Println(i, ret)
    }
}

//一个一个试,最直观思维
func ff(n int) int {
    ansval := 0
    ans := &ansval
    arr := make([]int, n)
    //第0个位置,肯定是1
    arr[0] = 1
    process(arr, 1, ans)
    return *ans
}

//递归
func process(arr []int, start int, ans *int) {
    if start == len(arr) {
        *ans++
        return
    }
    if arr[start-1] == 1 {
        arr[start] = 0
        process(arr, start+1, ans)
    }
    arr[start] = 1
    process(arr, start+1, ans)
}
```
代码结果如下:

[左神java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class26/Code02_FibonacciProblem.java)
[评论](https://user.qzone.qq.com/3182319461/blog/1612479635)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。