C++笔试强训day7

目录

1.字符串中找出连续最长的数字串

2.岛屿数量

3.拼三角


1.字符串中找出连续最长的数字串

链接

我的思路很简洁,就是双指针遍历,然后不断更新左位置left和右位置right和长度len。

然后我写代码的时候代码思路没跟上原本思路,直接把所有的l,r,len都存起来,然后最后再遍历一遍存起来的数。

回想起才发现思路清晰了,但是代码写的一塌糊涂,其实可以直接在遍历的过程中不断更新l,r,len就可以了。

一开始代码(可以通过,但是繁琐):

#include <iostream>
#include <vector>
using namespace std;
vector<pair<int, int>> vp(256);
int main() {
    string s;
    cin >> s;
    int l = 0, r = 0;
    int k = 0;
    while (r < s.size()) {
        while (!(s[l] >= '0' && s[l] <= '9')) {
            l++;
        }
        r = l;
        while (s[r] >= '0' && s[r] <= '9') {
            r++;
        }
        vp[k++] = { l, r - 1 };
        l = r;
    }
    int len = 0;
    int keyi = 0;
    for (int i = 0; i < k; ++i) {
        if ((vp[i].second - vp[i].first + 1) > len) {
            len = vp[i].second - vp[i].first + 1;
            keyi = i;
        }
    }
    string t(s.begin() + vp[keyi].first, s.begin() + vp[keyi].second + 1);
    cout << t << endl;
    return 0;
}

改进代码(相当于我改进思路的再改进,因为可以不用不存储右指针,因为有了左和长度就可以判断右):

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string s;
    cin >> s;

    int begin = -1, len = 0;
    for (int i = 0; i < s.size(); i++)
    {
        if (s[i] >= '0' && s[i] <= '9')
        {
            int j = i;
            while (j < s.size() && s[j] >= '0' && s[j] <= '9') j++;
            if (j - i > len)
            {
                begin = i;
                len = j - i;
            }
            i = j;
        }
    }

    if (begin == -1) 
        cout << "" << endl;
    else 
        cout << s.substr(begin, len) << endl;
    return 0;
}

这样不仅代码简洁,而且看起来也舒服。

begin初始化为负 -1 是为了判断有没有更新过

2.岛屿数量

链接

非常经典的一道DFS题目。

因为我见了很多DFS的题目返回值都为bool,因此我认为DFS必须以bool作返回值,结果导致浪费很多时间还得不到成果。

用不着返回值,直接深度遍历就可以求值:

class Solution {
  public:

    bool vis[220][220];
    int rowCount;
    int colCount;
    int dx[4] = {0,0,1,-1};
    int dy[4] = {1,-1,0,0};

    int solve(vector<vector<char>>& grid) {
        rowCount = grid.size();
        colCount = grid[0].size();

        // 用来记录岛屿数量
        int num_islands = 0;
        for (int row = 0; row < rowCount; row++) {
            for (int col = 0; col < colCount; col++) {
                // 如果当前位置是岛屿的一部分
                if (grid[row][col] == '1' && !vis[row][col]) {
                    // 从当前位置开始执行DFS, 标记整个岛屿
                    DFS(grid, row, col);
                    // 岛屿数量增加
                    num_islands++;
                }
            }
        }
        return num_islands;
    }

    void DFS(vector<vector<char>>& grid, int row, int col) {
        // 将当前位置标记为'0', 表示已访问
        vis[row][col] = true;
        // 检查并递归访问当前点的上下左右四个相邻点
        for(int i = 0; i < 4; ++i)
        {
            int x = row + dx[i];
            int y = col + dy[i];

            if(x >= 0 && x < rowCount && y >= 0 && y < colCount && !vis[x][y] && grid[x][y] == '1')
                DFS(grid, x, y);
        }
    }
};

3.拼三角

链接

因为只有六根棍子,直接排序后分类讨论即可:

我没有经过思考,所有就把所有情况都遍历了,真的很傻的行为,虽然过了,但是很繁琐嘞,太多情况了。

自己代码:

#include <algorithm>
#include <iostream>
#include <vector>
#define int long long
using namespace std;
bool Check(int a, int b, int c)
{
    int min1 = min(a, min(b, c)); // 最小
    int max1 = max(a, max(b, c)); // 最大
    int mid = a + b + c - min1 - max1;
    if (min1 + mid <= max1)
        return false;
    return true;
}
vector<int> v(6);
void solve()
{
    for (int i = 0; i < 6; ++i)
    {
        cin >> v[i];
    }
    sort(v.begin(), v.end());
    if (Check(v[0], v[1], v[2]))
    {
        if (Check(v[3], v[4], v[5]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[1], v[2], v[3]))
    {
        if (Check(v[0], v[4], v[5]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[2], v[3], v[4]))
    {
        if (Check(v[0], v[1], v[5]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[0], v[2], v[5]))
    {
        if (Check(v[1], v[3], v[4]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[0], v[2], v[4]))
    {
        if (Check(v[1], v[3], v[5]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[0], v[2], v[3]))
    {
        if (Check(v[1], v[4], v[5]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[0], v[1], v[3]))
    {
        if (Check(v[2], v[4], v[5]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[0], v[1], v[4]))
    {
        if (Check(v[2], v[3], v[5]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[0], v[3], v[4]))
    {
        if (Check(v[1], v[2], v[5]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    if (Check(v[0], v[3], v[5]))
    {
        if (Check(v[1], v[2], v[4]))
        {
            cout << "Yes" << endl;
            return;
        }
    }
    cout << "No" << endl;
}
signed main() {
    int t;
    cin >> t;
    while (t--)
        solve();
}

优化代码(只剩四种情况):

#include <iostream>
#include <algorithm>
using namespace std;
int t;
int arr[6];
int main()
{
    cin >> t;
    while (t--)
    {
        for (int i = 0; i < 6; i++) cin >> arr[i];
        sort(arr, arr + 6);
        if (arr[0] + arr[1] > arr[2] && arr[3] + arr[4] > arr[5] ||
            arr[0] + arr[2] > arr[3] && arr[1] + arr[4] > arr[5] ||
            arr[0] + arr[3] > arr[4] && arr[1] + arr[2] > arr[5] ||
            arr[0] + arr[4] > arr[5] && arr[1] + arr[2] > arr[3])
        {
            cout << "Yes" << endl;
        }
        else cout << "No" << endl;
    }

    return 0;
}

因为是排序过后的,所以只需要遍历包含第一个数在内的四种情况即可。

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

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

相关文章

遇坑分享24.4.25

在对数组进行排序算法时&#xff0c;如果我使用多个下标进行元素交换的时候&#xff0c;可能会出错。 以下面的直接选择排序&#xff08;排列升序&#xff09;为例&#xff1a; public static void selectSort1(int[] arr){int left0;int rightarr.length-1;while(left<rig…

2024HWqax线上产品培训试题(天眼)

最近做了qax笔试题&#xff0c;分享一下&#xff0c;仅供学习参考&#xff0c;侵删

力扣HOT100 - 200. 岛屿数量

解题思路&#xff1a; 岛屿题目一般使用dfs。 1.判断是否越界 2.用0&#xff0c;1&#xff0c;2三个状态标识当前格子的状态&#xff08;三个状态比两个状态更清晰&#xff09; 3.向周围四个方向遍历 class Solution {public int numIslands(char[][] grid) {int cnt 0;fo…

【Spring篇 | 补充】三级缓存解决循环依赖

文章目录 7.三级缓存解决循环依赖7.1何为循环依赖&#xff1f;7.2三级缓存解析7.3三级缓存解决循环依赖7.3.1实例化A7.3.2创建B的需求7.3.3实例化B7.3.4注入A到B7.3.5B创建完成7.3.6回溯至A7.3.7清理二级缓存 7.4为什么不能用二级缓存解决循环依赖&#xff1f; 7.三级缓存解决循…

删除docker的容器与镜像

如果您想要卸载通过 docker pull influxdb 命令下载的 InfluxDB 容器&#xff0c;您需要执行以下步骤&#xff1a; 1. **停止正在运行的 InfluxDB 容器**&#xff1a; 首先&#xff0c;您需要停止任何正在运行的 InfluxDB 容器。您可以使用以下命令来查找正在运行的 InfluxD…

Xilinx 7系列 clock IP核的使用(二)

在 Clocking Wizard 中的输出时钟设置部分&#xff0c;主要目的是生成并配置系统所需的特定时钟频率和信号。这一功能在硬件设计和开发中非常关键&#xff0c;因为它允许用户精确地控制各个部分的时钟信号&#xff0c;以满足特定的性能、功耗和时序要求。 1 配置输出时钟 要启…

宝宝洗衣机买什么样的好?诚意推荐四款实力超群的婴儿洗衣机

近几年家用洗衣机标准容积的大大增加&#xff0c;从5Kg、6Kg升级到9Kg、10Kg。大容量洗衣机满足了家庭中清洗大件衣物、床上用品的需求。但由于普通大型洗衣机所洗衣物混杂&#xff0c;很多时候由于宝宝小件衣物数量不多&#xff0c;却也并不适合放在一起扔进大型洗衣机中清洗。…

macOS 一些系统图标的存放位置 icns

macOS 一些系统图标的存放位置 icns macOS 中有很多好看的图标&#xff0c;有时候就想用一下它&#xff0c;我来告诉你他们的具体位置。 系统图标位置&#xff0c;像各种通用文件类型的图标都在这里面&#xff0c;里面好多高清的系统图标 /System/Library/CoreServices/Core…

使用PlantUML绘制活动图、泳道图

最近在学PlantUML 太漂亮了 给大家欣赏一下 我也记录一下 startuml |使用前| start :用户打开旅游App; |#LightSkyBlue|使用后| :用户浏览旅游信息; |#AntiqueWhite|登机前| :用户办理登机手续; :系统生成登机牌; |使用前| :用户到达机场; |登机前| :用户通过安检; |#Light…

快速入门Web开发(中)后端开发(有重点)

你好,我是Qiuner. 为记录自己编程学习过程和帮助别人少走弯路而写博客 这是我的 github gitee 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我会尽力带来有趣的内容 CSDN 图片导入做的不是很好&#xff0c;因此如果有没有…

这个合租室友真的没有一点公德心,还好他搬走了

这个合租室友真的没有一点公德心&#xff0c;还好他搬走了 这个出租屋有四个房间。 有三个卧室&#xff0c;和一个隔断。 我住三个卧室中的一个。下图中右边那个就是我住的。 2023年下半年&#xff0c;左边那个屋子来了一个新租户小白。 在住的过程中&#xff0c;隔断间的租…

Pulsar Meetup 深圳 2024 会务介绍

“ Hi&#xff0c;各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar Meetup 深圳 2024 报名倒计时啦&#xff0c;快来报名。这里汇集了腾讯、华为和谙流科技等大量 Pulsar 大咖&#xff0c;干货多多&#xff0c;礼品多多&#xff0c;不容错过啊。 ” 活动介绍 由 AscentStream 谙…

华为ensp中链路聚合两种(lacp-static)模式配置方法

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月26日11点54分 链路聚合&#xff08;Link Aggregation&#xff09;&#xff0c;又称为端口聚合&#xff08;Port Trunking&#xff09;&#xff0c;是一种将多条物理…

C++:拷贝构造函数的初始化列表

拷贝构造函数的初始化列表是在拷贝构造函数的定义中出现的一组初始值&#xff0c;用于初始化新创建的对象的成员变量。它的语法是在构造函数的声明后面使用冒号&#xff08;:&#xff09;来开头&#xff0c;然后列出要初始化的成员变量和它们的初始值。初始化列表的优点在于它允…

Linux--进程控制(1)

文章衔接&#xff1a; Linux--环境变量-CSDN博客 Linux--地址空间-CSDN博客 目录 1.进程创建 2.进程的终止 2.1想明白&#xff1a;终止是在做什么&#xff1f; 2.2进程终止的三种情况 2.3 进程如何终止 3.进程等待 &#xff08;wait/waitpid&#xff09; 1.进程创建 在li…

vue中form表单中select下拉v-model绑定有数值,但下拉框不显示值的情况

vue中form表单中select下拉v-model绑定有数值&#xff0c;但下拉框不显示值的情况 场景复现&#xff1a; 我将后端获取的数据手动赋值值给select的下拉v-model绑定对象对应的值&#xff0c;但在前端下拉框不显示我赋值的通过v-model给的值&#xff0c;通过控制台打印v-mode的值…

Linux常用监控命令(笔试面试常考)

1.、free命令 [rootRocky8-node1 ~]# free -htotal used free shared buff/cache available Mem: 1.7Gi 1.1Gi 69Mi 31Mi 554Mi 436Mi Swap: 2.0Gi 258Mi 1.7Gi free命令是Linux系统中用…

Java实战:确定给定日期是一年的第几天

本次实战&#xff0c;我们将探讨如何确定给定日期是一年中的第几天。为此&#xff0c;我们提供了三种不同的方法&#xff0c;每种方法都有其独特的实现方式和适用场景。 方法一&#xff1a;不使用数组 这种方法通过Scanner类获取用户的输入&#xff0c;包括年份、月份和日期。…

致远互联 OA fileUpload.do 文件上传漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 致远OA是一款企业级办公自动化软件&#xff0c;提供…

使用selenium时出现element click intercepted报错的解决办法

win10&#xff0c;python3.8.10。 selenium版本如下&#xff08;用pip38 show selenium查看&#xff09;&#xff1a; 在定位中&#xff0c;定位了一个按钮&#xff08;特点&#xff1a;button下还有span然后才是文本&#xff09;&#xff0c;代码如下&#xff1a; from sele…