【每日刷题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的元素。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码