【笔试刷题】笔记4

目录

1、过河卒

dfs

bfs

动态规划 

2、扑克牌顺子

排序 + 模拟

找规律

3、最长回文子串

中心拓展法


1、过河卒

5493. 过河卒 - AcWing题库

这道题我们很容易就能够想到dfs或bfs,但这两种算法都是会超时的

dfs

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int N = 25;

int a[N][N], n, m, x, y;
int dx[2] = {1, 0}, dy[2] = {0, 1};

void dfs(vector<pair<int, int>>& v, int& res, int x, int y)
{
    if(x == n && y == m) res ++;
    auto it = find(v.begin(), v.end(), make_pair(x, y));
    if(it != v.end()) return ; // 当前的x和y在马或马能跳到的点上
    // 当前位置是合法的
    for(int i = 0;i < 2;i ++)
    {
        int a = x + dx[i], b = y + dy[i];
        if(a >= 0 && a <= n && b >= 0 && b <= m)
        {
            dfs(v, res, a, b);
        }
    }
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m >> x >> y;
    // 需要知道马能跳跃到的点,看这8个点是否在方格中即可
    vector<pair<int, int>> v;
    v.push_back({x, y});
    if(x - 2 >= 0 && y - 1 >= 0) v.push_back({x - 2, y - 1});
    if(x - 1 >= 0 && y - 2 >= 0) v.push_back({x - 1, y - 2});
    if(x - 2 >= 0 && y + 1 <= m) v.push_back({x - 2, y + 1});
    if(x - 1 >= 0 && y + 2 <= m) v.push_back({x - 1, y + 2});
    if(x + 1 <= n && y + 2 <= m) v.push_back({x + 1, y + 2});
    if(x + 2 <= n && y + 1 <= m) v.push_back({x + 2, y + 1});
    if(x + 2 <= n && y - 1 >= 0) v.push_back({x + 2, y - 1});
    if(x + 1 <= n && y - 2 >= 0) v.push_back({x + 1, y - 2});
    int res = 0;
    dfs(v, res, 0, 0);
    cout << res << endl;
    return 0;
}

bfs

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;

const int N = 25;

int a[N][N], n, m, x, y;
int dx[2] = {1, 0}, dy[2] = {0, 1};

int bfs(vector<pair<int, int>>& v, int x, int y)
{
    auto it = find(v.begin(), v.end(), make_pair(x, y));
    if(it != v.end()) return 0;
    queue<pair<int, int>> q;
    q.push({x, y});
    int res = 0;
    while(!q.empty())
    {
        int t = q.front().first, p = q.front().second;
        q.pop();
        if(t == n && p == m) res ++;
        else
        {
            for(int i = 0;i < 2;i ++)
            {
                int a = t + dx[i], b = p + dy[i];
                auto it = find(v.begin(), v.end(), make_pair(a, b));
                if(a >= 0 && a <= n && b >= 0 && b <= m && it == v.end())
                    q.push({a, b});
            }
        }
    }
    return res;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m >> x >> y;
    // 需要知道马能跳跃到的点,看这8个点是否在方格中即可
    vector<pair<int, int>> v;
    v.push_back({x, y});
    if(x - 2 >= 0 && y - 1 >= 0) v.push_back({x - 2, y - 1});
    if(x - 1 >= 0 && y - 2 >= 0) v.push_back({x - 1, y - 2});
    if(x - 2 >= 0 && y + 1 <= m) v.push_back({x - 2, y + 1});
    if(x - 1 >= 0 && y + 2 <= m) v.push_back({x - 1, y + 2});
    if(x + 1 <= n && y + 2 <= m) v.push_back({x + 1, y + 2});
    if(x + 2 <= n && y + 1 <= m) v.push_back({x + 2, y + 1});
    if(x + 2 <= n && y - 1 >= 0) v.push_back({x + 2, y - 1});
    if(x + 1 <= n && y - 2 >= 0) v.push_back({x + 1, y - 2});
    cout << bfs(v, 0, 0) << endl;
    return 0;
}

动态规划 

真正要解决这道题,需要使用动态规划

我们先看看没有马时,从A点走到B点的路线数有几条


我们会发现第一行和第一列上的位置,到达这个位置的路线条数永远只有1条。其余位置到达这个位置的路线条数等于上边的点和左边的点的路线条数之和。

我们现在将马加入

此时第一行和第一列上的位置到达的路线数就不都是1条了,因为马所在位置和马经过一步跳跃能到达的位置都是不能到达的,所以我们直接让这些位置的路线数都是0,我们就会发现,第一行和第一列上的位置到达的路线数等于前一个位置的路线数。其余位置仍然等于上边的点和左边的点的路线条数之和。

#include<iostream>
using namespace std;

typedef long long ll;

const int N = 25;

ll f[N][N];
int n, m, x, y;

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> m >> x >> y;
    // 先将所有位置初始化为1,再将马所在的点以及马能够到达的点赋值为0,以此区分
    for(int i = 0;i <= n;i ++)
        for(int j = 0;j <= m;j ++) f[i][j] = 1;
    f[x][y] = 0;
    if(x - 2 >= 0 && y - 1 >= 0) f[x - 2][y - 1] = 0;
    if(x - 1 >= 0 && y - 2 >= 0) f[x - 1][y - 2] = 0;
    if(x - 2 >= 0 && y + 1 <= m) f[x - 2][y + 1] = 0;
    if(x - 1 >= 0 && y + 2 <= m) f[x - 1][y + 2] = 0;
    if(x + 1 <= n && y + 2 <= m) f[x + 1][y + 2] = 0;
    if(x + 2 <= n && y + 1 <= m) f[x + 2][y + 1] = 0;
    if(x + 2 <= n && y - 1 >= 0) f[x + 2][y - 1] = 0;
    if(x + 1 <= n && y - 2 >= 0) f[x + 1][y - 2] = 0;
    for(int i = 0;i <= n;i ++)
        for(int j = 0;j <= m;j ++)
        {
            if(i == 0 && j == 0) continue; // 起点不需要修改
            if(f[i][j] == 0) continue; // 马能到达的点不能走
            if(i == 0) f[i][j] = f[i][j - 1]; // 第一行
            else if(j == 0) f[i][j] = f[i - 1][j]; // 第一列
            else f[i][j] = f[i - 1][j] + f[i][j - 1]; // 其余位置
        }
    cout << f[n][m] << endl;
    return 0;
}

并且由于数据过大,还需要使用long long

2、扑克牌顺子

扑克牌顺子_牛客题霸_牛客网

排序 + 模拟

可以先将数组排为升序,然后计算出这个数组中0的个数,接着从不是0的位置开始,判断每个位置与后一个位置之间,需要几个数才能保证这个连续,用0的个数减去这个数,最终看存储0的个数的变量,若大于等于0,返回true,若小于0,返回false

class Solution {
public:
    bool IsContinuous(vector<int>& numbers) {
        sort(numbers.begin(), numbers.end());
        int zeros = 0;
        for(int i = 0;i < numbers.size();i ++) 
            if(numbers[i] == 0) zeros ++;
        if(zeros == 4) return true;
        for(int i = zeros;i < numbers.size() - 1;i ++)
        {
            if(numbers[i] == numbers[i + 1]) return false;
            zeros = zeros - (numbers[i + 1] - numbers[i] -1);
        }
        if(zeros >= 0) return true;
        else return false;
    }
};

找规律

我们会发现,如果能构成顺子的话,会满足以下两个条件:
1、不会出现重复元素
2、max - min <= 4

class Solution {
    bool hash[14] = {0};
public:
    bool IsContinuous(vector<int>& numbers) {
        int maxVal = 0, minVal = 14;
        for(auto x : numbers)
        {
            if(x)
            {
                if(hash[x]) return false;
                hash[x] = true;
                maxVal = max(maxVal, x);
                minVal = min(minVal, x);
            }
        }
        return maxVal - minVal <= 4;
    }
};

3、最长回文子串

1524. 最长回文子串 - AcWing题库

这里顺便说一下子串和子序列的区别:
子串:原始字符串中的一个连续子串
子序列:原始字符串的一个子集

中心拓展法

我们可以枚举字符串中所有的点,并以这些点为中心,向两边扩散,直到扩散到超出字符串范围或者两个新加入的元素的值不相等时。此时要注意,对于回文子串可以是奇数,也可以是偶数,所以我们在由中心向两边扩展时,需要同时考虑两种情况。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string s;
    getline(cin, s);
    int max_len = 0;
    for(int i = 0;i < s.size();i ++)
    {
        int l = i, r = i;
        while(l >= 0 && r < s.size() && s[l] == s[r])
        {
            if(r - l + 1 > max_len) max_len = r - l + 1;
            l --, r ++;
        }
        l = i, r = i + 1;
        while(l >= 0 && r < s.size() && s[l] == s[r])
        {
            if(r - l + 1 > max_len) max_len = r - l + 1;
            l --, r ++;
        }
    }
    cout << max_len << endl;
    return 0;
}

时间复杂度是O(n^2),空间复杂度是O(1) 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型中的token是什么;常见大语言模型的 token 情况

目录 大模型中的token是什么 常见大语言模型的 token 情况 大模型中的token是什么 定义 在大模型中,token 是文本处理的基本单位。它可以是一个字、一个词,或者是其他被模型定义的语言单元。简单来说,模型在理解和生成文本时,不是以完整的句子或段落为单位进行一次性处理…

kafka里的consumer 是推还是拉?

大家好&#xff0c;我是锋哥。今天分享关于【kafka里的consumer 是推还是拉&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka里的consumer 是推还是拉&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;消费者&…

少儿编程培训市场突破500亿元:教育新蓝海的崛起与未来展望

近年来&#xff0c;随着科技的迅速发展和家长对教育方式的重视&#xff0c;少儿编程市场成为一片新的蓝海。据最新市场调研报告显示&#xff0c;2024年中国少儿编程培训市场规模已突破500亿元&#xff0c;预计未来五年将持续增长。这一趋势反映了少儿编程教育的迅速崛起&#x…

【如何使用api接入星火大模型】(超详细,亲测有效!)

1 实现思路&#xff1a; 1.鉴权说明: 先在控制台创建应用&#xff0c;利用应用中提供的appid&#xff0c;APIKey&#xff0c; APISecret进行鉴权&#xff0c;生成最终请求的鉴权url。1.2 鉴权参数 host&#xff08;请求主机&#xff09;、date&#xff08;当前时间戳&#xff0…

国标GB28181软件EasyGBS国标GB28181网页直播平台在邮政快递场景中的应用

随着电子商务的迅猛发展&#xff0c;邮政快递行业迎来了前所未有的发展机遇&#xff0c;但同时也面临着诸多挑战。如何在保障货物安全、提高运输效率的同时&#xff0c;实现全面的监控和管理&#xff0c;成为邮政快递企业亟需解决的问题。国标GB28181网页直播平台EasyGBS作为一…

渗透测试练习题解析 7 (CTF web)

一、[红明谷CTF 2021]write_shell 1 考点&#xff1a; 1、PHP 短标签 2、 符号的使用 通过代码可知 check 是一个过滤函数&#xff0c;利用正则的方式过滤掉 空格、php、eval 等一些关键字或符号&#xff0c;$dir 是路径&#xff0c;这个值可以通过 actionpwd 获取到&#…

day-77 超级饮料的最大强化能量

思路 动态规划&#xff1a;因为每一步要么选A&#xff0c;要么选B&#xff0c;所以问题可以转换为求最后一步从A选或从B选中的较大值 解题过程 定义而二维数组dp,dp[i][0]表示最后一步从A取能获得的最大能量&#xff0c;dp[i][1]表示最后一步从B取能获得的最大能量状态转换方程…

(03)萨班斯-奥克斯利法案(SOX)--- 你和公司的违法成本有多大?

【前言】如果你的公司需要去美国上市&#xff1f;你知道如果违反了萨班斯-奥克斯利法案&#xff08;SOX&#xff09;&#xff0c;你和公司的风险和成本吗&#xff1f; 一、萨班斯-奥克斯利法案&#xff08;SOX&#xff09;合规性是指什么- 你必须知道&#xff0c;如果你的公司要…

C++ | Leetcode C++题解之第517题超级洗衣机

题目&#xff1a; 题解&#xff1a; class Solution { public:int findMinMoves(vector<int> &machines) {int tot accumulate(machines.begin(), machines.end(), 0);int n machines.size();if (tot % n) {return -1;}int avg tot / n;int ans 0, sum 0;for (…

【Linux】从内核角度理解 TCP 的 全连接队列(以及什么是 TCP 抓包)

文章目录 概念引入理解全连接队列内核方面理解Tcp抓包方法注意事项 概念引入 我们知道&#xff0c;TCP的三次握手是由TCP协议 自动处理的&#xff0c;建立连接的过程与用户是否进行accept无关&#xff0c;accept()的作用主要是为当前连接创建一个套接字&#xff0c;用于进行后…

适合视频搬运的素材网站推荐——短视频素材下载宝库

对于摄影爱好者和短视频创作者来说&#xff0c;找到适合搬运和创作的视频素材至关重要。无论是用于丰富画面、增加背景细节&#xff0c;还是提升作品的视觉吸引力&#xff0c;这些素材网站都能为你的创作提供极大帮助。今天&#xff0c;我将为大家推荐几个优质的素材网站&#…

百数功能更新——表单提交支持跳转到外部链接并支持传参

百数的表单外链功能允许用户将表单以链接的形式分享给外部用户&#xff0c;外部用户无需登录或加入团队即可访问并填写表单。 本次更新的表单提交后跳转指定链接的功能&#xff0c;在支持跳转内部链接的基础上&#xff0c;支持用户在完成表单填写并提交后&#xff0c;自动跳转…

初探Servlet

文章目录 1. Servlet概述1.1 定义1.2 作用 2. 主要知识点2.1 生命周期2.2 请求处理2.3 Servlet配置 3. 案例演示3.1 创建Web应用项目3.2 修改项目工件名3.3 重新部署Web项目3.4 创建WelcomeServlet3.5 编写doGet方法代码3.6 编写doPost方法代码3.7 访问WelcomeServlet 4. 小结 …

国标GB28181公网平台EasyGBS国标GB28181公网直播与国标协议的优质对接方案

随着信息技术的飞速发展&#xff0c;视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一变革中&#xff0c;国标GB28181公网平台EasyGBS凭借其强大的功能和广泛的应用场景&#xff0c;成为视频监控平台与国标协议对接的优质方案。 应急管理部门正积极推进以信…

MySQL数据表导入到clickhouse数据库中

前言&#xff1a;研发需求&#xff0c;需要把MySQL数据导入到clickhouse中来测试计算性能是否提升。 从MySQL导入到clickhouse需要两个工具 NavicatDBeaver 导出MySQL数据 连接上MySQL>选择数据库>选择数据表 选择csv格式 导出数据 下面全部默认即可 开始导出 …

通俗易懂的餐厅例子来讲解JVM

餐厅版本 JVM&#xff08;Java虚拟机&#xff09;可以想象成一个虚拟的计算机&#xff0c;它能够运行Java程序。为了让你更容易理解&#xff0c;我们可以用一个餐厅的比喻来解释JVM&#xff1a; 菜单&#xff08;Java源代码&#xff09;&#xff1a; 想象一下&#xff0c;Java…

力扣——113. 路径总和

113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…

【Rust中的序列化:Serde(一)】

Rust中的序列化&#xff1a;Serde Serde是什么&#xff1f;什么是序列化序列化&#xff1f;Serde运行机制Serde Data ModelVistor ApiSerializer ApiDeserializer Api 具体示例流程分析具体步骤&#xff1a;那么依次这个结论是如何得出的呢?什么是de? 总结 Serde是什么&#…

基于生成式人工智能的工业互联网安全技术与应用研究

摘要&#xff1a;近年来&#xff0c;人工智能技术飞跃式发展&#xff0c;工业互联网安全与大模型、生成式人工智能等新技术融合成为研究的重点方向和难题。针对工业互联网安全领域面临的突出性问题&#xff0c;对该领域人工智能应用现状进行了分析与研究&#xff0c;提出了一种…

神舟十九号发射取得圆满成功 科技自强自力筑梦天穹

10月30日凌晨神舟十九号载人飞船发射取得圆满成功&#xff01; 图片来自网络 当日凌晨4时27分&#xff0c;搭载神舟十九号载人飞船的长征二号F遥十九运载火箭在酒泉卫星发射中心点火发射取得圆满成功。执行神舟十九号载人飞行任务的航天员乘组由蔡旭哲、宋令东、王浩泽3名航天…