开发者社区> 问答> 正文

遇到一个斐波那契字符数问题,求解答。

Tom 发现了一种神奇的字符串 - 斐波那契字符串 , 定义 f[1]=0,f[2]=1, 对于所有的 i>2 都有f[i]=f[i-2]+f[i-1],其中“+”代表拼接,比如01+10=0110,现在对于字符串 f[n],请判断 f[n] 的第 k 项是 0,还是 1。输入两个数字 n 和 k(n<=300,k<=1000000000)。输出 f[n] 的第k位,如果k大于f[n]的位数,则输出-1。

展开
收起
游客4skzfvnrxrzbi 2021-12-23 16:51:52 535 0
1 条回答
写回答
取消 提交回答
  • 这个问题可以使用递归的方法来求解。 题目中给出了字符串拼接的规律:f[i]=f[i-2]+f[i-1]。可以看出对于第 i 个字符串, 它的前半部分属于第 i-2 个字符串,后半部分属于第 i-1 个字符串。 这样,当给定具体的n和k时,我们可以首先判断k位于第n个字符串的前半 部分还是后半部分,然后递归的把 k 传递给第 n-2 或 n-1 个字符串。 计算过程: 1. 为了判断属于前半部分还是后半部分,需要计算每一个字符串的长度。 一个 len 数组。每个位置为对应字符串的长度。 len[1]=len[2]=1; len[i]=len[i-2]+len[i-1]; 1.如果 k >len[n],则输出 -1。 2.设置递归函数intfind(int i,int k); 这个函数返回第 i 个字符串中 k 个位置的字符 3.判断 k 在前半部分还是后半部分。 a)K<=len[i-2] 前半部分,调用 find(i-2,k) b)K>len[i-2] 后半部分,调用 find(i-1,k-len[i-2]) 上面的计算在第一步时会遇到问题,当n大于几十的时候,len 就会超出 int 的范围。对这个问题的解决基于对递归过程的观察,第4步a)中k始终是不变的,i的奇偶性也保持不变。所以在计算第1步len时可以提前停止,当发现len[i]>=k且i与 n 的奇偶性相同时。第 4 步中的递归起始也可以使用第 i 个字符串开始,而不是第n 个。

    2021-12-23 18:43:43
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载