【每日刷题3.21】2道算法+1道真题+8道面试 - 阿V

算法题(牛客网)

1. 二叉树根节点到叶子节点的所有路径和

 获得新能力未知长度个位数数组的输入,层序遍历递归创建二叉树。


代码详情(ACM):

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


struct TreeNode { //二叉树节点结构体
	int val;
	TreeNode* left;
	TreeNode* right;

	TreeNode(int val) :val(val), left(nullptr), right(nullptr) {};
};


TreeNode* CreateTree(vector<int> nums, int i) { //创建二叉树
	if (i > nums.size() || nums[i - 1] == -1) { //超出数组或数值为-1,返回nullptr
		return nullptr;
	}
	TreeNode* node = new TreeNode(nums[i - 1]);
	node->left = CreateTree(nums, i * 2); //遍历左子树,该节点左孩子为i*2
	node->right = CreateTree(nums, (i * 2) + 1); //遍历右子树,该节点右孩子为i*2+1

	return node;
}


class Solution {
public:
	int sumNumbers(TreeNode* root) {
		int result = DFS(root, 0); //存储所有路径和

		return result;
	}


	int DFS(TreeNode* root, int sum) { //深度遍历
		if (!root) return 0; //节点为nullptr返回0

		sum = sum * 10 + root->val; //计算路径和
		if (!root->left && !root->right) { //root为叶子节点返回当前sum
			return sum;
		}

		int l_sum = DFS(root->left, sum); //遍历左子树
		int r_sum = DFS(root->right, sum); //遍历右子树

		return l_sum + r_sum;//返回和
	}
};


/*
输入数据:
1 2 3

*/
int main() {
	vector<int> nums; //存储数据
	char ch;
	while (cin >> ch) { //输入数据
		int num;
		if (ch == '#') {
			num = -1;
		}
		else {
			num = ch - '0';
		}
		nums.push_back(num);
		if (cin.get() == '\n') {
			break;
		}
	}
	TreeNode* root = CreateTree(nums, 1); //创建二叉树

	Solution sl;
	cout << sl.sumNumbers(root);

	return 0;
}

2. 二叉树中和为某一值的路径(二)

 获得新能力:获取未知长度数组,


代码详情(ACM):

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


struct TreeNode { //二叉树节点结构体
	int val;
	TreeNode* left;
	TreeNode* right;

	TreeNode(int val) :val(val), left(nullptr), right(nullptr) {};
};


TreeNode* CreateTree(vector<int> nums,int i) { //创建二叉树
	if (i > nums.size() || nums[i-1] == -1001) { //越界或空指针标志
		return nullptr;
	}

	TreeNode* node = new TreeNode(nums[i-1]);
	node->left = CreateTree(nums, i * 2); //遍历左子树
	node->right = CreateTree(nums, (i * 2) + 1); //遍历右子树

	return node;
}


class Solution {
private:
	vector<vector<int>> paths; //所有满足expectNumber的路径

public:
	vector<vector<int>> FindPath(TreeNode* root, int expectNumber) {
		DFS(root, expectNumber, 0, {});

		return paths;
	}


	void DFS(TreeNode* root, int expectNumber, int sum, vector<int> path) { //深度遍历
		if (!root) return;
		
		path.push_back(root->val); //保存当前节点
		sum += root->val; //计算当前节点
		if (!root->left && !root->right && sum == expectNumber) { //是否满足expectNumber
			paths.push_back(path);
		}

		DFS(root->left, expectNumber, sum, path); //遍历左子树
		DFS(root->right, expectNumber, sum, path); //遍历右子树

		return;
	}
};


/*
输入数据:
10 5 12 4 7
22

*/
int main() {
	vector<int> nums; //存储节点值
	string str;
	while (cin >> str) { //输入数据
		int num;
		if (str == "#") {
			num = -1001;
		}
		else {
			num = atoi(str.c_str());
		}
		nums.push_back(num);
		if (cin.get() == '\n') {
			break;
		}
	}
	TreeNode* root = CreateTree(nums, 1); //创建二叉树

	int expectNumber = 0; //期望值
	cin >> expectNumber;

	Solution sl;
	vector<vector<int>> result = sl.FindPath(root, expectNumber);
	int n = result.size();
	for (int i = 0; i < n; ++i) {
		int m = result[i].size();
		for (int j = 0; j < m; ++j) {
			cout << result[i][j];
			if (j + 1 < m) {
				cout << ' ';
			}
			else {
				cout << endl;
			}
		}
	}

	return 0;
}

3. 出模拟赛

 

 还是理解不了,可恶,放弃这道题了。

面试题

1. 堆和栈的区别?

1. 堆存放动态分配对象。需要手动释放

2. 栈存放非static对象,如局部对象等。由程序自动释放

2.  左值和右值

1. 左值:可取地址有名字非临时

2. 右值:不可取地址没有名字临时

3.  进程间的通信的几种方式

 管道及命名管道信号消息队列共享内存信号量套接字

4. 线程同步的方式

 互斥量信号量信号(事件)。

5.  OSI网络体系结构

1. 物理层:相邻计算机节点之间比特流的透明传送

2. 数据链路层:接收物理层的比特流数据,封装成帧。接收网络层的帧,拆装为比特流数据

3. 网络层:将网络地址翻译成对应的物理地址,并选择最适当的路径。

4. 传输层:提供可靠的数据传输

5. 会话层:用户应用程序和网络之间的接口

6. 表示层:数据编码,压缩和解压缩,数据的加密和解密。

7. 应用层:为用户的应用进程提供网络通信服务

6.  TCP/IP模型

 物理链路层、网络层、传输层、应用层。

 7. 请简单解释算法是什么?

 将输入以最有效的形式计算并输出的过程。

8. 解释什么是快速排序算法?

 基于分割交换排序的原则,将排序列表分为三个主要部分:1. 小于Pivot的元素 2. 枢轴元素Pivot 3. 大于Pivot的元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZW游戏制造

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值