【百日冲大厂】第十九篇,牛客网选择题+编程题汽水瓶+ 查找两个字符串a,b中的最长公共子串(动态规划问题)

news2024/9/25 13:26:18

前言:

  • 大家好,我是良辰丫,第十九篇,牛客网选择题+编程题汽水瓶+ 查找两个字符串a,b中的最长公共子串(动态规划问题).💞💞💞
  • 生活就像一只盲盒,藏着意想不到的辛苦,当然也有万般惊喜的可能。不管是次次都如愿以偿,还是赢面寥寥无几,终究起起伏伏才是常态。我们既有过顺遂,也难免绝望,但若一陷入困境就立即抽身而退,那就再也没有翻盘的可能。只要生活还在继续,就有赢的可能。

🧑个人主页:良辰针不戳
📖所属专栏:百日冲大厂
🍎励志语句:生活也许会让我们遍体鳞伤,但最终这些伤口会成为我们一辈子的财富。
💦期待大家三连,关注,点赞,收藏。
💌作者能力有限,可能也会出错,欢迎大家指正。
💞愿与君为伴,共探Java汪洋大海。

在这里插入图片描述

目录

  • 1. 选择题
  • 2. 编程题
    • 2.1 汽水瓶
    • 2.2 查找两个字符串a,b中的最长公共子串

1. 选择题

在这里插入图片描述

  • 线性表包含链表和顺序表(数组).
  • 顺序表既要逻辑地址连续,存取顺序也要连续(物理地址连续).
  • 链表要求逻辑地址连续,物理地址不连续.

在这里插入图片描述

  • 栈遵循先进后出原则.
  • 依次入栈,所以出栈序列为入栈序列反过来.

在这里插入图片描述

  • 非完全二叉树不能采用顺序表的存储结构,因为非完全二叉树会有空节点,不便于统计位置关系.
  • 二叉树中只有完全二叉树可以使用数组存储.

在这里插入图片描述

  • 递归函数是自己调用自己的函数.
  • 递归最终结束是因为有一个不调用自己的结束条件.

在这里插入图片描述

  • 二叉树遍历中前序+中序或者中序加后序可以推断出另外一种遍历方式,由此我们要记住推断遍历方式一定有中序.
  • 后序遍历(前序遍历)可以找到根节点,中序遍历可以给二叉树分支.

在这里插入图片描述

  • 我们从左往右先还原二叉树.
  • 然后根据前序遍历根左右还原前序遍历的序列.

在这里插入图片描述

  • 堆分为大根堆和小根堆.
  • 大根堆的堆比孩子节点大.
  • 小根堆的堆比孩子节点小.

在这里插入图片描述

用一系列的关键字除以13取余数,结果为1的符合标准.

在这里插入图片描述

  • 当内存中放不下所有要排序的数据,要借助外部空间(通常借助磁盘)进行排序.
  • 我们学过的外部排序只有归并排序.

在这里插入图片描述

树的深度是最大节点的高度(从根节点开始算第一层).

2. 编程题

2.1 汽水瓶

做题链接:
链接: 汽水瓶

题目描述:

在这里插入图片描述
在这里插入图片描述

题目分析:
说白了这其实就是一个数学问题,理清了逻辑,问题就会迎刃而解了.

  • 手里有0个瓶子或者有1个瓶子只能喝0瓶,因为只有三个瓶子才可以换汽水.
  • 在这里我们需要注意的是可以喝老板借瓶子,当我们的瓶子是两个的时候,可以向老板借一个瓶子,三个空瓶子换一瓶汽水,喝完汽水把空瓶子还给老板即可.
  • 处理完0个与1个的空瓶子,我们就要处理2个及其2个以上的空瓶子.
  • 空瓶子大于等于3的时候就可以换汽水,此时我们喝汽水的总数sum = empty / 3.
  • 当然我们还要计算我们的剩余空瓶子数量,喝完汽水的空瓶子加上我们换完汽水剩余的空瓶子.empty = empty/3 + empty%3.
  • 当然最后我们还要处理一下边界问题,如果空瓶子数量为2,那么我们在喝汽水的数量sum的基础上加1.
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            if(n == 0){
                return;
            }
            int num = nums(n);
            System.out.println(num);

        }
    }
    private static int nums(int n){
        if(n <2){
            return 0;
        }
        int sum = 0;
        int empty = n;
        while(empty>=3){
            sum+= empty/3;
            empty = empty%3+empty/3;
            }
        if(empty == 2){
            sum+=1;
        }
        return sum;
    }
    }

2.2 查找两个字符串a,b中的最长公共子串

做题链接:
链接: 查找两个字符串a,b中的最长公共子串

题目描述:

在这里插入图片描述

在这里插入图片描述

题目分析:
今天有见到了一个动态规划的题目,接下来跟着良辰的步伐去分析一下.

  • 动态规划(dp)用到的是分治思想,也就是把一个较大的问题化解成小问题,根据小问题的解推导大问题的解(公式).
  • 要想解决动态规划的问题,我们首先要去了解状态,状态转移方程,状态初始化,返回值.
  • 状态也就是问题的描述,问题求的是两个字符串的最大公共子串.我们可以先归纳子问题,也就是字符串A的子串与字符串B的子串的最大公共子串,然后我们用数组下标进行描述,A的前 i 个字符与B的前 j 个字符的最长公共子串
  • 状态转移方程是如何得到的呢?根据我们的状态进行推导,并且加上我们的状态的前后关联.如果A的前 i 个字符与 B的前 j 个字符相同的时候,f(i,j) = f(i - 1,j-1) + 1;不相同的时候f(i,j) = 0.这时候有人就有疑惑了,为什么不相同的时候f(i,j) = 0呢?注意我们这里返回的是最大子串的内容,不是返回它的最大长度,不相同的为0是为了重新定义(重新找)子串的初始位置.
  • 返回值是最大公共子串的内容,因此我们需要记录最长公共子串的起始位置和结束位置.
import java.util.*;
public class Main {
    public static String getMaxSubstr(String str1, String str2){
        char[] arr1 = str1.toCharArray();
        char[] arr2 = str2.toCharArray();
        int len1 = arr1.length;
        int len2 = arr2.length;
		//最长子串的起始位置
        int start = 0;
		//最长子串的长度
        int maxLen = 0;
		//多增加一行一列,作为辅助状态
		//状态: 以a的第i个字符结尾和以b的第j个字符结尾的最长公共子串的长度
        int[][] maxSubLen = new int[len1 + 1][len2 + 1];
        for(int i = 1; i <= len1; ++i)
        {
            for(int j = 1; j <= len2; ++j)
            {
				//如果第i个字符和第j个字符相等,则进行累加
                if(arr1[i - 1] == arr2[j - 1])
                {
                    maxSubLen[i][j] = maxSubLen[i - 1][j - 1] + 1;
				//更新最长公共子串
                    if(maxLen < maxSubLen[i][j])
                    {
                        maxLen = maxSubLen[i][j];
                        start = i - maxLen;
                    }
                }
            }
        }
        return str1.substring(start, start + maxLen);
    }
    public static void main(String[] args) 
    {
        Scanner sc = new Scanner(System.in);
        String str1;
        String str2;
        while(sc.hasNext()) {
            str1 = sc.next();
            str2 = sc.next();
            //为什么要以短的为主体呢?我们要看清题哈.
            if (str1.length() < str2.length())
                System.out.println(getMaxSubstr(str1, str2));
            else
                System.out.println(getMaxSubstr(str2, str1));
        }
    }
}
  • 在题目描述中我们看到这样一句话 : 查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
  • 因为没看清题多走了许多弯路哈哈.

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

一定要看清题,这道题是以短的为主体,要不然研究半天根本不知道自己为啥错了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【自动化测试】——Selenium (基于java)

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启软件测试的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 一、认识Selenium 1.什么是自动化测…

原码的表示

原码表示 定点整数源码与定点小数源码 源码表示例题 正数与负数转换直接将高位变为1即可 原码的性质 原码的优缺点 乘除法直接符号位异或&#xff0c;数值相乘除即可加法与减法需要先判断两个数值的大小然后确定符号位

软件开发项目延期就天天加班,你认为有效吗?

目录 一、软件开发项目延期的因素 1.1 客户需求变更 1.2 开发人员变动 1.3 技术瓶颈 1.4 对外沟通问题 二、相应的解决方案 2.1 需求变更管理机制 2.2 公司内部人员培训和团队建设 2.3 技术难题攻关 2.4 优化沟通流程 三、总结 软件开发项目延期时加班并不是一个长期…

C++之std::forward模板函数用法(一百四十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

2023.7.2-逆向显示键入的整数

功能&#xff1a;输入一个整数(多位)&#xff0c;逆向显示输入的结果。 程序&#xff1a; int main() {int a;printf("请输入一个整数&#xff1a;");scanf("%d",&a);if (a < 0)printf("请输入一个正整数");else{while (a>0){printf…

力扣 -- 931. 下降路径最小和

题目链接&#xff1a;931. 下降路径最小和 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码&#xff1a; class Solution { public:int minFallingPathSum(vect…

动态规划 DP (四) 子序列问题

5.子序列问题 1&#xff09; 力扣https://leetcode.cn/problems/longest-increasing-subsequence/解题思路&#xff1a;因为子序列&#xff0c;其实就意味着要进行两层遍历了&#xff0c;分别列举子序列的结尾坐标和开始坐标&#xff0c;这样才能遍历完所有子序列。然后遍历的…

Linux学习-实操篇

Linux学习 实操篇 学自尚硅谷武晟然老师&#xff0c;结合老师课堂内容和自己笔记所写博文。 文章目录 Linux学习实操篇Shell介绍文件目录一、目录操作命令1.1 查看和切换工作目录1.2 列出目录内容1.3 创建和删除目录 二、文件操作命令2.1 创建文件2.2 复制文件或文件夹2.3 删除…

Django之ORM与MySQL对比

ORM 把类映射成数据库中的表&#xff0c;把类的一个实例对象映射成数据库中的数据行&#xff0c;把类的属性映射成表中的字段&#xff0c;通过对象的操作对应到数据库表的操作&#xff0c;实现了对象到SQL、SQL到对象的转换过程。 下面以一个商品库存明细表 myfirstapp_sku&…

spring boot/spring cloud项目中创建Moudel子模块出现 Ignored pom.xml

出现问题&#xff1a; 在 IDEA 项目的父工程中创建了子模块&#xff0c;但是由于子模块创建有误&#xff0c;删了后重新创建&#xff0c;出现了 Ignored pom.xml 的问题。 分析问题&#xff1a; 分析原因&#xff1a;应该是 IDEA 觉得这个项目已经被你删除了&#xff0c;所以…

pandas (十) 缺失值的处理:填充、删除、过滤、查询

Pandas使用函数处理缺失值 isnull和notnull&#xff1a;检测是否是空值&#xff0c;可用于df和seriesdropna&#xff1a;丢弃、删除余缺失值 axis: 删除行还是列&#xff0c;{0 or ‘index’, 1 or ‘columns’), default 0 how: 如果等于any则任何值为空都删除&#xff0c;如…

630到期,全面整改完成!

2023年6月30日对于消费金融行业的同学来讲&#xff0c;是一个大日子。 因为在2022年7月12日的时候&#xff0c;银监会特意下发了一个通知&#xff0c;《提升金融服务质效的通知》&#xff0c;原文见文末。 里面要求各金融机构进行相应整改&#xff0c;而整改的截止日期就是2023…

C++ 多线程

多线程是多任务处理的一种特殊形式&#xff0c;多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下&#xff0c;两种类型的多任务处理&#xff1a;基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行。…

Unity GameFramework StarForce 流程介绍

一、游戏总入口 GameEntry 1.内建好的GameEntry.Builtin 提供了各种框架的组件封装 2.自定义GameEntry.Custom 根据提供的案例参考即可实现自己的组件 3.游戏入口GameEntry 二、实现自己的组件并注册到管理类中 我们自己的组件只需要继承UnityGameFramework.Runtime.Gam…

实现数据库增删改产+界面效果2-----jsp

任务 1.通过连接数据库完成用户登录模块。 2.登录成功后查询出一张数据库表中的内容&#xff1b;登录不成功返回登录页面。 3.登录页面端要有空值和非法字符验证。 4.登录成功后对一张表中数据进行增加、删除、修改和查询操作。 代码 数据库相关代码 创建数据库 名字为jdb…

76、基于STM32单片机车牌识别摄像头图像处理扫描设计(程序+原理图+PCB源文件+相关资料+参考PPT+元器件清单等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

阿里拿38K出来的大佬良心分享,熬夜整理10 万字详细Java面试笔记

国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度。 这是由于互联网IT行业的求职者太多了&#xff0c;如果考察的是清一溜的算法题和设计题&#xff0c;那么会要求面试官有极高的技术水平&#xff0c;还要花大量的时间成本和精力。 所以&#xff0c;八股文面…

#systemverilog# 关于随机约束之 unique 关键字

前言 在随机约束中,我们可以使用关键字 unique 。 使用关键字unique定义的SystemVerilog约束称为唯一约束。在随机化中,使用唯一约束可以生成变量集的唯一值或数组的唯一元素。这里着重解释一下变量集:是同一类型随机变量的集合。 通过unique约束我们可以完成以下任务: …

详解c++---哈希桶

目录标题 闭散列的回顾拉链法/哈希桶的原理准备工作find函数插入函数erase函数析构函数代码测试insert函数的改进 闭散列的回顾 在前面的学习中我们知道了闭散列的运算规则&#xff0c;当两个数据计算得到的位置发生冲突时&#xff0c;它会自动的往后寻找没有发生冲突的位置&a…

樽海鞘群算法(SSA)(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…