蓝桥杯刷题——day2

蓝桥杯刷题------day2

题目一

题干

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
题目链接: 三步问题
示例1:

输入:n = 3

输出:4

说明: 有四种走法

示例2:

输入:n = 5

输出:13

题目解析

这条题目老生常谈了,其实就是青蛙跳台的问题,只不过从青蛙只能跳1格或者2格改成了可以跳1格或者2格或者3格而已,青蛙跳台的问题可以看我的这个博客:青蛙跳台。因此思想仍然是不变的,也就是说可以用动态规划解决这个问题:同样的,初始情况是:

f(1) = 1

f(2) = 2

f(3) = 4

f(n) = f(n-1)+f(n-2) +f(n-3)

下面是完整代码:

代码

java 复制代码
class Solution {
    //f(1) = 1
    //f(2) = 2
    //f(3) = 4
    //f(n) = f(n-1) + f(n-2) + f(n-3)

    public int waysToStep(int n) {
        ArrayList<Integer> list = new ArrayList<>();
        if(n == 1){
            return 1;
        }
        if(n == 2){
            return 2;
        }
        if(n == 3){
            return 4;
        }
        list.add(1);
        list.add(2);
        list.add(4);
        for(int i = 3; i < n;i++){
            list.add(((list.get(i-1) + list.get(i-2)) % 1000000007  + list.get(i - 3)) % 1000000007) ;
        }
        return list.get(n-1);
    }
}

有的同学要问了,怎么感觉不对劲呀,这个1000000007是个什么玩意,这个当然是题目的要求,因为我们在计算到后面的时候数字会越来越大,因此很可能超出int的范围,因此我们需要对结果进行取余,而题目的要求是对1000000007取余,那么满足他题目的要求就可以了,还有一个问题:(list.get(i-1) + list.get(i-2)) % 1000000007,这个是为什么?当然是因为,list.get(i-1)和list.get(i-2)单独的值都是在int范围内的,但是两者相加就不一定了,因此我们要对他俩和的结果进行取余。

题目二

题干

给你一个字符串 s,找到 s 中最长的回文子串。
题目链接: 最长回文子串
示例一:

输入:s = "babad"

输出:"bab"

解释:"aba" 同样是符合题意的答案。

示例二:

输入:s = "cbbd"

输出:"bb"

解题思路

这道题看起来无从下手,其实并不难,我们可以利用滑动窗口来解决,什么意思?例如:求解s = "babad"的最长回文子串,我们画个图来理解一下:

我们设置一个滑动窗口的长度为5,那么我们在定义两个指针x和y,两个指针同时向中间移动,直到指针相遇如果都满足两指针指向的字符一样,那么则证明长度为5就是最长回文子串,如果指针在相遇之前不满足两指针指向的字符一样,那么我们滑动窗口长度减去1,变为4,也就是一下两种情况:

以此类推,如此一来滑动窗口逐步减少,总能够找到符合条件的最长回文子串。下面是完整代码:

代码

java 复制代码
import java.util.*;
class Solution {
        public boolean Palindrome(char[] array, int x,int y){
            while(x < y){
                if(array[x] == array[y]){
                    x++;
                    y--;
                }else {
                    break;
                }
            }
            if(x >= y){
                return true;
            }else {
                return false;
            }
        }

        public String longestPalindrome(String s) {
            ArrayList<String> list = new ArrayList<>();
            char[] array = s.toCharArray();
            int size = array.length;
            int i = 0;
            for(i = size;i > 0; i--){
                for(int j = 0; j <size - i + 1 ;j++){
                    if(Palindrome(array,j, i -1 + j)){
                        char[] subArray = Arrays.copyOfRange(array, j, i + j);
                        String result = new String(subArray);
                        list.add(result);
                        break;
                    }
                }
            }
            return list.get(0);
        }
}

当然我这个方法肯定不是最优解,肯定有各位方便巧妙的方法,如果各位有什么想法或者建议欢迎私信+评论,感谢大家的点赞和收藏!

相关推荐
蒙奇D索大7 分钟前
【数据结构】图解图论:度、路径、连通性,五大概念一网打尽
数据结构·考研·算法·图论·改行学it
uhakadotcom11 分钟前
2025年春招:如何使用DeepSeek + 豆包优化简历,轻松敲开心仪公司的大门
算法·面试·github
小白狮ww15 分钟前
Retinex 算法 + MATLAB 软件,高效率完成图像去雾处理
开发语言·人工智能·算法·matlab·自然语言处理·图像识别·去雾处理
trust Tomorrow1 小时前
每日一题-力扣-2278. 字母在字符串中的百分比 0331
算法·leetcode
Lecea_L2 小时前
你能在K步内赚最多的钱吗?用Java解锁最大路径收益算法(含AI场景分析)
java·人工智能·算法
Tony882 小时前
热题100 - 394. 字符串解码
java·算法
Lecea_L2 小时前
🔍 找到数组里的“节奏感”:最长等差子序列
java·算法
是Dream呀2 小时前
ResNeXt: 通过聚合残差变换增强深度神经网络
人工智能·算法
学习2年半2 小时前
53. 最大子数组和
算法
君义_noip3 小时前
信息学奥赛一本通 1524:旅游航道
c++·算法·图论·信息学奥赛