8.25奇安信C++笔试

看到许多同学第一题是用的拓扑排序的方法,这里贴一个动态规划的方法:
class Solution {
public:
	/**
	* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
	*
	* 计算dag 路径上起始到目的节点的路径数目
	* @param nodes int整型vector<vector<>> 第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a ),若为空,就是没有下一个节点了。
	* @return int整型
	*/
	int DagPathNum(vector<vector<int> >& nodes) {
		// write code here
		int ans = 0;
		int n = nodes.size();
		vector<vector<int>> dp(n, vector<int>(n, 0));
		for (int i = 0; i < n; ++i){
			for (int d : nodes[i]){
				dp[i][d] = 1;
			}
		}
		
		for (int i = n - 2; i >= 0; --i){
			for (int j = i + 1; j < n; ++j){
				for (int k : nodes[i]){
					dp[i][j] += dp[k][j];
				}
				
			}
		}
		return dp[0][n - 1];
	}
};
第二题就简单了,双指针求解:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
class Solution {
public:
	int MaxArea(vector<int> &points){
		int left = 0, right = points.size() - 1;
		int ans = 0;
		while (left<right)
		{
			ans = max(ans, (right - left)*min(points[left], points[right]));
			if (points[left] <= points[right])
				++left;
			else
				--right;
		}
		return ans;
	}
};
int main(){
	//vector<int> points = { 4, 1, 2, 7 };
	Solution s;
	string nums;
	while (getline(cin, nums)){
		vector<int> points;
		string t = "";
		for (int i = 1; i < nums.size() - 1; ++i){
			if (nums[i] == ','){
				points.emplace_back(stoi(t));
				t.clear();
			}
			else{
				t += nums[i];
			}
		}
		if (t.size()>0)
			points.emplace_back(stoi(t));
		cout << s.MaxArea(points) << endl;
		getchar();
	}
	return 0;
}



#奇安信笔试##奇安信23秋招题怎么回事,看不懂#
全部评论
。。。。。。我犯了大罪,第一题题目例子写0到4,我以为都是0到4,直接传了4进去,怎么改都只能过40
点赞 回复 分享
发布于 2022-08-25 21:04 湖南
第一题跟楼主思路一样,但开个一维数组就可以了
点赞 回复 分享
发布于 2022-08-29 23:55 安徽

相关推荐

6 4 评论
分享
牛客网
牛客企业服务