深信服2025届全球校招研发笔试-C卷(AK)

news/2024/9/28 13:36:20 标签: c语言, 算法, c++, 经验分享, 动态规划

前面14个填空题

T1

已知 子数组 定义为原数组中的一个连续子序列。现给定一个正整数数组 arr,请计算该数组内所有可能的奇数长度子数组的数值之和。

输入描述

输入一个正整数数组arr

输出描述

所有可能的奇数长度子数组的和

示例 1
输入

1,4,2,5,3

输出

58

说明

解释:所有奇数长度子数组和它们的和为:
[1] = 1
[4] = 4
[2] = 2
[5] = 5
[3] = 3
[1,4,2] = 7
[4,2,5] = 11
[2,5,3] = 10
[1,4,2,5,3] = 15
我们将所有值求和得到1 + 4 + 2 + 5 + 3 + 7 + 11 + 10 + 15 = 58

C++实现代码

#include <bits/stdc++.h>
#include <iostream>
#include <string> 
#include <sstream>

using namespace std;

int main() {
	string input;
	vector<int> v;
	getline(cin, input);

	stringstream ss(input);
	string item;
	while (getline(ss, item, ',')) {
		v.push_back(stoi(item));
	}

	long long ans = 0;
	int n = v.size();
	for (int i = 0; i < n; i++) {
		long long cur = 0;
		int cnt = 0;
		for (int j = i; j < n; j++) {
			cur += v[j];
			cnt += 1;
			if (cnt % 2) {
				ans += cur;
			}
		}
	}
	cout << ans << endl;
	return 0;
}

在这里插入图片描述

T2

平台运行过程中出现异常时一般会将信息记录在后台日志文件中,定位问题时通常使用关键字进行过滤。正则表达式具备很强大的文本匹配功能,能够快速高效地处理文本。常见元字符为:

^:匹配字符串开头。
$:匹配字符串结尾。
.:匹配任意字符。
*:匹配前面的字符零次或多次。
+:匹配前面的字符一次或多次。
?:匹配前面的字符零次或一次。

给定一个输入字符串s和一个字符模式p,s和p的长度均在100以内,要求实现一个支持’.‘和’*'的正则表达式匹配。字符模式必须能够完全匹配输入字符串。

如果匹配成功返回1,匹配失败返回0

请设计一个时间复杂度为 O(mn)或更优的算法来解决这个问题。如果使用内置正则库得0分。

输入描述

第一行输入为字符串s
第二行输入为字符模式p

输出描述

如果匹配成功返回1,匹配失败返回0

示例 1

输入

aaa
a*

输出

1

说明

通配符*可以匹配aa

示例 2

输入

abaa
ab*a

输出

0

说明

通配符*匹配前面的字符零次或多次,由于前面的字符是b,无法匹配a

示例 3

输入

abaa
ab.a

输出

1

说明

通配符.可以匹配任意字符,因此能够匹配a

C++实现代码

#include <bits/stdc++.h>
#include <iostream>

using namespace std;

bool isMatch(string s, string p) {
    int m = s.size(), n = p.size();
    vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
    dp[0][0] = true;
    for (int j = 1; j <= n; j++) {
        if (p[j - 1] == '*') {
            // s为空字符串的时候, *匹配0个元素, 例如"a*" = ""
            dp[0][j] = dp[0][j - 2];
        }
    }
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (s[i - 1] == p[j - 1] || p[j - 1] == '.') {
                dp[i][j] = dp[i - 1][j - 1];
            }
            else if (p[j - 1] == '*') {
                // *匹配0次
                if (s[i - 1] != p[j - 2] && p[j - 2] != '.') {
                    dp[i][j] = dp[i][j - 2];
                    // *匹配多次
                }
                else {
                    dp[i][j] = dp[i][j - 2] || dp[i - 1][j];
                }
            }
        }
    }
    return dp[m][n];
}

int main() {
    string s, p;
    cin >> s >> p;
    if (isMatch(s, p)) {
        cout << 1 << endl;
    }
    else {
        cout << 0 << endl;
    }
    return 0;
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

T3

给定存在 N个元组的集合,每个元组里面的值为(等级,价格),等级和价格都是非负整数。在集合中选取数量大于0小于等于N的元组,要求这些元组的等级差不能超过x,并且它们的价格之和最大。最后输出最大的价格

输入描述

第一行包含两个整数 N 和 x (1 ≤ n ≤ 105,1 ≤ x ≤ 1010) —— 分别是给定的元组集合的数量和等级差。
接下来的 N 行是元组的具体数值,每一行为一个元组的两个值,等级和价格,数字之间用空格隔开

输出描述

输出选取的元组最大的价格之和

示例 1

输入

4 2
0 14
3 16
8 9
10 18

输出

27

说明
总共有4个元组,限制选取的元组等级差为2,那么只能选第三和第四个,或者只选一个。对比这几种选组,价格之和最高的是选第三和第四个元组,结果为27。

C++实现代码

#include <bits/stdc++.h>
#include <iostream>

using namespace std;

int main() {
	int N;
	long long x;
	cin >> N >> x;
	vector<vector<long long>> v(N, vector<long long>(2));
	for (int i = 0; i < N; i++) {
		cin >> v[i][0] >> v[i][1];
	}

	sort(v.begin(), v.end());
	long long ans = 0;
	int i = 0, j = 0;
	long long cur = v[0][1];
	while (j < N) {
		if (v[j][0] - v[i][0] <= x) {
			ans = max(ans, cur);
			j++;
			if (j < N) {
				cur += v[j][1];
			}
		}
		else {
			cur -= v[i][1];
			i++;
		}
	}
	cout << ans << endl;
	return 0;
}

在这里插入图片描述

T4

小明正在一个由m x n的单元格组成的游戏地图上寻找金币,地图由一个二维整数数组 grid 表示。每个 grid[i][j] 都表示地图上单元格 (i, j) 的金币数量。如果 grid[i][j]是 0,表示这个单元格没有金币。如果 grid[i][j]是正数,表示这个单元格有grid[i][j] 个金币。如果 grid[i][j]是-1,表示这个单元格是不可到达的区域。小明的起始位置是左上角,也就是点(0,0),并且每次可以向上、下、左、右四个方向移动,但不能移出游戏地图。小明有一个特殊的技能: 他可以使用这个技能将一个不可到达的区域(-1的单元格)变为可达区域,但是他只能使用一次这个技能。使用技能后,不可到达的区域会变成0,也就是没有金币但是可以通过。
你的任务是帮助小明计算,他最多可以收集多少个金币。

输入描述

m,n范围为[0,100]
grid[i][j]值范围为[-1,5],其中0≤i≤m,0≤j≤n

输出描述

输出收集金币数

示例 1

输入

[1,-1]
[1,1]

输出

2

说明

输入一个2*2的二维数组,小明将grid [0][1](或grid[1][0])的-1变成0则可收集到价值2金币,故输出2

示例2

输入

[-1]

输出

0

说明

输入一个1*1的二维数组,小明无论是否使用技能都无法获得金币,故输出0

C++实现代码

#include <bits/stdc++.h>
#include <iostream>
#include <string>
#include <sstream>
#include <deque>

using namespace std;

int main() {
	vector<vector<int>> v;
	string line;
	while (getline(cin, line) && !line.empty()) {
		istringstream iss(line.substr(1, line.size() - 2));
		string token;
		vector<int> row;
		while (getline(iss, token, ',')) {
			if (!token.empty()) {
				row.push_back(stoi(token));
			}
		}
		v.push_back(row);
	}

	deque<pair<int, int>> dq;
	vector<vector<int>> vis;
	int m, n;

	m = v.size();
	n = v[0].size();

	vis.assign(m, vector<int>(n, 0));

	function<int(void)> func = [&](void){
		if (v[0][0] == -1) {
			return 0;
		}
		dq.clear();
		vis.assign(m, vector<int>(n, 0));
		dq.push_back({ 0, 0 });
		vis[0][0] = 1;
		// 下上右左
		int dx[] = { 0, 0, 1, -1 };
		int dy[] = { 1, -1, 0, 0 };
		int ans = 0;
		while (!dq.empty()) {
			auto [x, y] = dq.front();
			dq.pop_front();
			ans += v[x][y];
			for (int i = 0; i < 4; i++) {
				int nx = x + dx[i], ny = y + dy[i];
				if (nx >= 0 && nx < n && ny >= 0 && ny < m && v[nx][ny] >= 0 && !vis[nx][ny]) {
					vis[nx][ny] = 1;
					dq.push_back({ nx, ny });
				}
			}
		}
		return ans;
	};

	int ans = func();
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (v[i][j] == -1) {
				v[i][j] = 0;
				ans = max(ans, func());
				v[i][j] = -1;
			}
		}
	}
	cout << ans << endl;
	return 0;
}

在这里插入图片描述
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!


http://www.niftyadmin.cn/n/5681193.html

相关文章

Spark Job 对象 详解

在 Apache Spark 中&#xff0c;Job 对象是执行逻辑的核心组件之一&#xff0c;它代表了对一系列数据操作&#xff08;如 transformations 和 actions&#xff09;的提交。理解 Job 的本质和它在 Spark 中的运行机制&#xff0c;有助于深入理解 Spark 的任务调度、执行模型和容…

ESP32 Bluedroid 篇(1)—— ibeacon 广播

前言 前面我们已经了解了 ESP32 的 BLE 整体架构&#xff0c;现在我们开始实际学习一下Bluedroid 从机篇的广播和扫描。本文将会以 ble_ibeacon demo 为例子进行讲解&#xff0c;需要注意的一点是。ibeacon 分为两个部分&#xff0c;一个是作为广播者&#xff0c;一个是作为观…

深度学习自编码器 - 提供发现潜在原因的线索篇

序言 在探索复杂数据背后的秘密时&#xff0c;深度学习如同一把锐利的钥匙&#xff0c;特别是其核心的表示学习机制&#xff0c;为我们打开了一扇通往未知世界的大门。表示学习不仅仅是数据的简单编码或转换&#xff0c;它更是深度挖掘数据内在结构、关系与规律的过程。在这一…

web前端-CSS引入方式

一、内部样式表 内部样式表(内嵌样式表)是写到html页面内部,是将所有的 CSS 代码抽取出来,单独放到一个<styie>标签中。 注意: ① <style>标签理论上可以放在 HTML文档的任何地方&#xff0c;但一般会放在文档的<head>标签中 ② 通过此种方式&#xff0c;可…

【JavaEE初阶】深入理解wait和notify以及线程饿死的解决

前言&#xff1a; &#x1f308;上期博客&#xff1a;【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题-CSDN博客 &#x1f525;感兴趣的小伙伴看一看小编主页&#xff1a;【JavaEE初阶】深入解析死锁的产生和避免以及内存不可见问题-CSDN博客 ⭐️小编会在后端开…

Reactor 反应堆模式

Reactor 反应堆模式 1、概念 Reactor&#xff08;反应堆&#xff09;模式是一种事件驱动的设计模式&#xff0c;通常用于处理高并发的I/O操作&#xff0c;尤其是在服务器或网络编程中。它基于事件多路复用机制&#xff0c;使得单个线程能够同时管理大量并发连接&#xff0c;而…

el-table给列加单位,表头加样式,加斑马纹

<el-table ref"table" class"dataTable" :data"detailList" :header-cell-style"tableHeaderColor" :row-class-name"tableRowClassName" highlight-current-row><el-table-column label"序号" al…

git 基本原理

文章内容来源于视频 举个案例&#xff0c;家族里面有一本记载祖传秘籍的菊花宝典&#xff0c;这本菊花宝典的正本存储在家族祠堂里面&#xff0c;每一个家庭从正本复制一本存在自己家中&#xff0c;称为副本。这个过程称为clone 一个家庭需要再菊花宝典中添加技能&#xff0c…