C++笔试强训day7

2024-04-27 17:28
文章标签 c++ 笔试 强训 day7

本文主要是介绍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;
}

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

这篇关于C++笔试强训day7的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/941096

相关文章

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快