题解 | #牛牛恨66#

牛牛恨66

http://www.nowcoder.com/practice/05dab66e4e814e21a9a3496fbddb69f1

题意整理

  • 输入正整数图片说明
  • 图片说明图片说明 之间,有多少个数字不包含连续的图片说明 ,则输出多少。

方法一(记忆化递归)

1.解题思路

  • 递归终止条件:当输入为0时,只有1不含66,返回1;当输入为1时,1到10这十个数都不含66,返回10。
  • 递归如何推进:当前位(第i位)可以选择6,也可以不选择6。如果选择6,那么i-1位必须不选择6(共9种选择),此时可由i-2层得到i层,共图片说明 种情况;如果不选择6,那么直接由i-1层得到i层,共图片说明 种情况。
  • 每一层返回值:返回当前层可能数图片说明

由于普通递归,会有很多重复计算的情况,可以用一个记忆数组记录之前计算过的情况。

2.代码实现

import java.util.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return string字符串
     */
    //声明记忆数组
    long[] memo;

    public String calculate (int n) {
        //初始化记忆数组
        memo=new long[n+1];
        //递归
        dfs(n);
        //转化为String
        return String.valueOf(memo[n]);
    }

    private long dfs(int i){
        //终止条件1
        if(i==0){
            memo[i]=1;
            return 1;
        } 
        //终止条件2
        if(i==1){
            memo[i]=10;
            return 10;
        } 
        if(memo[i]!=0) return memo[i];
        memo[i]=(dfs(i-2)+dfs(i-1))*9;
        //返回当前层状态
        return (dfs(i-2)+dfs(i-1))*9;
    }
}

3.复杂度分析

  • 时间复杂度:最多递归n次,所以时间复杂度是图片说明
  • 空间复杂度:需要额外大小为n+1的记忆化数组,所以空间复杂度为图片说明

方法二(动态规划)

1.解题思路

  • 状态定义:图片说明 表示输入为i时,有多少个数字不含有连续的6。
  • 状态初始化:当输入为0时,只有1不含66,赋值为1;当输入为1时,1到10这十个数都不含66,赋值为10。
  • 状态转移:当前位可以选择6,也可以不选择6。如果选择6,那么i-1位必须不选择6(共9种选择),此时可由图片说明 进行计算,共图片说明 种情况;如果不选择6,那么直接由图片说明 进行计算,共图片说明 种情况。综合考虑,图片说明

动图展示:
图片说明

2.代码实现

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return string字符串
     */
    public String calculate (int n) {
        //定义dp数组
        long[] dp=new long[n+1];
        //赋初始
        dp[0]=1;
        dp[1]=10;
        //根据状态转移方程,确定所有的状态
        for(int i=2;i<=n;i++){
            dp[i]=(dp[i-2]+dp[i-1])*9;
        }
        //转化为字符串
        return String.valueOf(dp[n]);
    }
}

3.复杂度分析

  • 时间复杂度:循环体总共执行n-1次,所以时间复杂度是图片说明
  • 空间复杂度:需要额外大小为n+1的dp数组,所以空间复杂度为图片说明
xqxls的题解 文章被收录于专栏

牛客题解

全部评论

相关推荐

10-31 13:04
南华大学 Java
嵌入式的小白:很多面试,面试前不会去打扰cto的,但一般cto不会在这些小事上刷人,只能说这个cto比较操心,啥重要不重要,紧急不紧急的,估计都会过问,平淡看待吧
点赞 评论 收藏
分享
头像
昨天 16:48
已编辑
百度_高级研发工程师
事实是检验真理的唯一标准。&nbsp;无论我们怎么去说,去讲述,去证明,都抵不过一个offer来得实在,无论我们怎么去复现求职中的摸爬滚打、扒皮抽筋、狼狈不堪,都抵不过你在简历写上大厂的名字(外包不算)。&nbsp;所以在我求职期间,我什么话都不说,什么话都不讲,因为没有意义,虽然我总讲过程才是意义,但只有当你上岸的那一刻,你才有资格回想在水里的挣扎,只有等你出了山,你才知道山的全貌。&nbsp;我为什么一定要离开华为OD,难道它不稳定吗,不能赚钱吗。为了证明自己,那肯定有的。其实更多的是印证我的认知是否真的正确。&nbsp;(给不了解我的人交代一下背景,在下双非一本,gap一年,华为OD外包,摸爬滚打4个月,艰难上岸百度正编)一、...
先锋战士:说得很真诚。鄙视链自古有之,学历,家庭背景,财富,权利。从小有之,小学羡慕那些当班委的,中学羡慕那些学生会的,高中羡慕尖子班拿教学金的,大学羡慕高绩点,毕业了羡慕进大厂的。工作了,又羡慕高职级的,再后来又羡慕别人早早结婚的。我想表达的观点很简单,无论是华为od还是百度,都是经历,没有孰高孰低,为了抵达下一个风景,总会付出更多东西,但不就是人生吗?正如登山,每个阶段的山,都要想办法攀登,在博主的文字中,见到了坚持和积极寻找问题解决办法的心态
学历对求职的影响
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务