数据结构编程题 查找
二叉树定义以下为本文解题代码的二叉树定义。
struct TreeNode {
int val;
TreeNode* left, *right;
TreeNode(int val = 0, TreeNode* left = nullptr, TreeNode* right = nullptr)
: val(val), left(left), right(right) {}
};
递归二分查找题目描述写出二分查找的递归算法。初始调用时,left 为1,right 为 n.
解题代码bool recurBS(vector<int>& nums, int target, int left, int right) {
if (left > right) return false;
int mid = (left + right) / 2;
if (nums[mid] == target) return true;
else if (nums[mid] > target) {
return recu ...
数据结构编程题 图
图定义邻接表struct ArcNode { // 边结点
int verIdx, weight;
ArcNode* next;
ArcNode(int verIdx, int weight, ArcNode* next) : verIdx(verIdx), weight(weight), next(next) {}
};
struct VNode { // 顶点结点
char vertex;
ArcNode* first;
};
struct AlGraph {
vector<VNode> VNodes;
};
邻接矩阵struct MGraph {
vector<char> vertices; // 顶点集
vector<vector<int>> edges; // 邻接矩阵
};
邻接表转邻接矩阵题目描述写出从图的邻接表转化为邻接矩阵的算法。
解题代码MGraph adjList2Matrix(AlGraph& AG) ...
数据结构编程题 二叉树
二叉树定义以下为本文解题代码的二叉树定义。
struct TreeNode {
int val;
TreeNode* left, *right;
TreeNode(int val = 0, TreeNode* left = nullptr, TreeNode* right = nullptr)
: val(val), left(left), right(right) {}
};
非递归先序遍历题目描述编写先序遍历二叉树的非递归算法。
解题代码void nonRecurPre(TreeNode* root) {
if (root == nullptr) return;
stack<TreeNode*> s;
while (root != nullptr || !s.empty()) {
if (root != nullptr) {
cout << root->val << " ";
s.emplace(root);
root = root->left ...
数据结构编程题 栈和队列
判断合法序列题目描述假设 I 和 O 分别表示入栈和出栈操作,栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由 I 和 O 组成的序列,可以操作的序列称为合法序列,否则称为非法序列。编写一个算法,判定所给的序列是否合法。若合法,返回 true,否则返回 false.
解题代码bool isLegalSequence(const string& sequence) {
int iCnt = 0;
for (int i = 0; i < sequence.size(); ++i) {
if (sequence[i] == 'I') {
++iCnt;
}
else {
--iCnt;
}
if (iCnt < 0) {
return false;
}
}
return iCnt ...
数据结构编程题 链表
链表定义以下为本文解题代码的链表定义。
struct ListNode {
int val;
ListNode* next;
ListNode(int val = 0, ListNode* next = nullptr) : val(val), next(next) {}
};
递归删除结点题目描述设计一个递归算法,删除不带头结点的单链表 L 中的所有值为 x 的结点,并返回新的链表头节点。
解题代码ListNode* deleteNodeRecur(ListNode* head, int x) {
if (head == nullptr) return head;
head->next = deleteNodeRecur(head->next, x);
if (head->val == x) {
ListNode* nextNode = head->next;
delete head;
return nextNode;
...
数据结构编程题 顺序表
删除最小值题目描述从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
解题代码bool deleteMin(vector<int>& nums, int& val) {
if (nums.empty()) {
return false;
}
int minVal = INT32_MAX, minIdx = 0;
for (int i = 0; i < nums.size(); ++i) {
if (minVal > nums[i]) {
minVal = nums[i];
minIdx = i;
}
}
nums[minIdx] = nums.back();
val = minVal;
return true;
}
逆置顺序表题目描述 ...
有关C++字符串拷贝的一个小问题
最近面试被问到了一个 C++ 中的小问题,就是如果有字符串 s1 和 s2,将 s1 赋值给 s2 后,它们的内存分布是什么样的。当时感觉可能是共享的,但也不太确定,回来后查阅资料发现结果并不是那么简单。
查阅资料首先是询问 chatGPT 得到的答案,如下:
如果两个 string 对象存储相同的字符串,它们可能会共享同一个内存块,也可能会分别分配自己的内存块。当一个 string 对象被创建时,它会分配一个新的内存块,并将字符串复制到该内存块中。当第二个 string 对象被创建时,它可能会使用与第一个 string 对象相同的内存块,也可能会分配一个新的内存块并将字符串复制到该内存块中。
代码测试看来又是一个没有标准解决方案的问题,于是我编写了一个简单的程序用来在不同的环境下测试。
void* operator new(size_t count) {
cout << "Allocate " << count << " Bytes" << endl;
return malloc(count);
}
i ...
计算机基础面试题总结
承接上文,本文总结了计算机基础学科(包括数据结构、计算机组成原理、操作系统、计算机网络等)常见的一些面试问题,以便随时查看。
常见的进程调度算法有哪些
先来先服务调度算法:处于就绪态的进程按先后顺序链入到就绪队列中,而先来先去服务调度算法按就绪进程进入就绪队列的先后次序选择当前最先进入就绪队列的进程来执行,直到此进程阻塞或结束,才进行下一次的进程选择调度。
短进程优先调度算法:是一种按照进程执行时间长短进行调度的算法,即优先调度执行时间短的进程。
优先级调度算法:优先级调度算法又称优先权调度算法。优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。
高响应比优先调度算法:该算法是对 FCFS 调度算法和 SPF 调度算法的一种综合平衡,同时考虑每个进程的等待时间和估计的运行时间。在每次进行进程调度时,先计算就绪队列中每个进程的响应比,从中选出响应比最高的进程投入运行。
时间片轮转调度算法:时间片轮转调度算法主要适用于分时系统。每次调度时,把 CPU 分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,由一个计时器发出时钟中断请求,调 ...
C++面试题总结
由于考研失利,最近在准备春招,想要找一份游戏客户端开发的岗位,便想要将 C++ 常见的面试题整理出来。题目来自牛客网的 C++ 面试题库,答案结合了牛客网给出的参考答案、new bing 给出的回答以及个人的理解和思考。
C++ 和 C 中 struct 的区别,以及 C++ 中 struct 和 class 的区别C++ 和 C 中 struct 的区别
C 中 struct 只能定义成员变量,不能定义成员函数,而 C++ 中 struct 可以定义成员函数,甚至构造函数,析构函数,友元等。
C 中 struct 内的成员变量不可以直接初始化,而 C++ 中可以。
C 中使用结构体需要加上 struct 关键字,或者使用 typedef 对结构体取别名后再直接使用其别名,而 C++ 使用结构体则可以直接忽略 struct 关键字。
C++ 中 struct 和 class 的区别
class 的成员默认是 private 的,而 struct 的成员默认是 public 的。
class 继承默认是 private 继承,而 struct 继承默认是 public 继承。
s ...
C++中的静态(static)
一般来说,C++ 中的 static 关键字具有不同的含义,而这取决于它的使用场景。
函数内的变量我们知道,函数内作为一个局部作用域,其中定义的临时变量将会在函数执行结束后被销毁。
void Func() {
int x = 0;
++x;
cout << x << endl;
}
int main() {
Func(); // 输出1
Func(); // 输出1
Func(); // 输出1
}
但我们可以通过在变量前添加 static 关键字将该其定义为一个静态变量,该静态变量的生存周期贯穿于整个程序周期,这一点类似于全局变量,但不同的是静态变量的作用域仍然保持不变,也就是整个函数体内。
void Func() {
static int x = 0;
++x;
cout << x << endl;
}
int main() {
// x = 10; 编译出错
Func(); // 输出1
Func(); // 输出2
Func ...