今日刷题总结-leetcode485、母牛繁殖问题、猴子偷桃问题(2020.11.7)

Leetcode485

  题目:

    给定一个二进制数组, 计算其中最大连续1的个数。

    示例 1:

    输入: [1,1,0,1,1,1]
    输出: 3
    解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.
    注意:

    输入的数组只包含 0 和1。
    输入数组的长度是正整数,且不超过 10,000。

  本人思路:

    想利用两个数组,一个是原题目中的数组,一个是自定义数组count,count数组的作用是用来存储出现连续1后1的数量,比如 [1,0,1,1,1,0,0,1,1]这个数组,数组中是否每一个count索引存储出现连续1时1的数量,count[0]=1,count[1]=3,count[2]=2。采用for的嵌套循环,外层循环控制新数组的索引,内层循环用来控制原数组对连续1进行计数,每当碰到1就对count对应索引的元素加一,碰到0就退出本层循环,为了避免内层循环从头开始继续,需要用外层的变量对内层变量进行初始化。最后对count数组进行遍历之后提取出最大元素。

 

  伪代码:

    

class Solution {
    public int findMaxConsecutiveOnes(int[] nums) {
        int[] count = new int[1000000];
        int max =0;
        for(int j =0;j<count.length;j++)
        {
            for(int i=j;i<nums.length;i++)
            {
                if(nums[i]==1)
                {
                    count[j]++;
                }
                if(nums[i]==0)
                {
                    break;
                }         
            }
        }
        for(int j =0;j<count.length;j++)
        {
            
            if(count[j]>max)
            {
                max = count[j];
            }
        }
        return max;
    }
}

蓝桥杯(1004)-母牛的故事

  题目:   

    题目描述

      有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

    输入

      输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
      n=0表示输入数据的结束,不做处理。

    输出

      对于每个测试实例,输出在第n年的时候母牛的数量。
      每个输出占一行。

    样例输入
      2
      4
      5
      0
    样例输出
      2
      4
      6

 本人思路:
  
    首先观察题目,不难发现母牛在前三年内的数量都为1,但在第4年开始,牛的总数等于前一年和前第三年这两年牛数量的总和,这不禁让我想到了斐波那契数列数列,这个数列从第3项开始,每一项都等于前两项之和。
    所以我们只需要定义第一年和第三年牛的总数,就可以利用循环计算出对应年份的牛的总数。
 

  伪代码:


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Scanner sc = new Scanner(System.in);
        int[] num = new int[3];
        int i =0;
        //hasNext使得判断为true时不断输入。
        while(sc.hasNext())
        {
            int n = sc.nextInt();
            if(n==0)
            {
                break;
            }

            num[i] = cownum(n);
            i++;
        }
        for (int j =0;j<num.length;j++)
        {
            System.out.println(num[j]);
        }
    }
    public static int cownum(int x) {
        //定义一个长度为60的数组
        int[] a = new int[60];
        a[0] = 1;
        a[1] = 2;
        a[2] = 3;
        //类斐波那契数列
        for(int i=3;i<x;i++)
        {
            a[i] = a[i-1]+a[i-3];
        }

        return a[x-1];
    }
}

蓝桥杯(1020)-猴子吃桃

  题目:    
    题目描述:
      猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
    输入
      N
    输出
      桃子总数
    样例输入
      10
    样例输出
      1534

个人思路:
  既然知道最后只剩下了一个桃子,我们不妨采用逆向推理,从最后剩下的一个桃子上做文章,找出初始桃子总数和下一台你桃子总数之间的关系为2n+2,采用递归的方法轻松解决这道题目,关键的递归的条件就是我们知道最后仅仅剩下一个桃子。


   伪代码题解:  
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int day = sc.nextInt();

        System.out.println(eat(day));
        
    }
    private static int eat(int n){
        if (n==1){
            return 1;
        }
        return(2+2*eat(n-1));
    }
}


 



原文地址:https://www.cnblogs.com/MurasameLory-chenyulong/p/13942035.html