计算机基础面试题总结
承接上文,本文总结了计算机基础学科(包括数据结构、计算机组成原理、操作系统、计算机网络等)常见的一些面试问题,以便随时查看。
常见的进程调度算法有哪些
先来先服务调度算法:处于就绪态的进程按先后顺序链入到就绪队列中,而先来先去服务调度算法按就绪进程进入就绪队列的先后次序选择当前最先进入就绪队列的进程来执行,直到此进程阻塞或结束,才进行下一次的进程选择调度。
短进程优先调度算法:是一种按照进程执行时间长短进行调度的算法,即优先调度执行时间短的进程。
优先级调度算法:优先级调度算法又称优先权调度算法。优先级调度算法每次从就绪队列中选择优先级最高的进程,将处理机分配给它,使之投入运行。
高响应比优先调度算法:该算法是对 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 继承。
st ...
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( ...
LeetCode周赛总结 第334场
左右元素和的差值题目链接左右元素和的差值
解题思路直接按照题目要求模拟即可,两次遍历求出 leftSum 和 rightSum,再计算得出 answer.
解题代码class Solution {
public:
vector<int> leftRigthDifference(vector<int>& nums) {
int n = nums.size();
vector<int> leftSum(n, 0);
for (int i = 0; i < n - 1; ++i) {
leftSum[i + 1] = leftSum[i] + nums[i];
}
vector<int> rightSum(n, 0);
for (int i = n - 1; i > 0; --i) {
rightSum[i - 1] = rightSum[i] + num ...
LeetCode周赛总结 第333场
合并两个二维数组 - 求和法题目链接合并两个二维数组 - 求和法
解题思路本题较为基础,可以直接分别遍历两数组,再用哈希表记录两数组中各编号的累加和,但该方法比较消耗空间,时间上的性能也不理想。
考虑到数组 nums1 和 nums2 都包含互不相同的 id,并按 id 以递增顺序排列,因此想到利用归并排序的思想,设立双指针 p1 和 p2,若两指针所指数组元素的 id 相同,则将 { nums1[p1][0], nums1[p1][1] + nums2[p2][1] } 进行归并,否则将较小 id 的元素(假设 p1 所指元素 id 更小) { nums1[p1][0], nums1[p1][1] } 进行归并。
解题代码class Solution {
public:
vector<vector<int>> mergeArrays(vector<vector<int>>& nums1, vector<vector<int>>& nums2) {
v ...
LeetCode周赛总结 第331场
从数量最多的堆取走礼物题目链接从数量最多的堆取走礼物
解题思路直接按照流程模拟即可,将数组 gifts 的元素放入优先队列中,然后每次从中选出最大值 maxGift,再将 sqrt(maxGift) 放回队列,重复 k 次,计算队列剩余的值总和。
解题代码class Solution {
public:
long long pickGifts(vector<int>& gifts, int k) {
// 这里求 gifts 总和要注意累加初始值定义为 0ll(long long 类型),否则 int 可能溢出
// 当然也可以不求初始总数量,而在循环结束后直接统计剩余的数量
long long sum = accumulate(gifts.begin(), gifts.end(), 0ll);
priority_queue<int> Q(gifts.begin(), gifts.end());
long long res = 0;
for ( ...
2022年游戏总结
今年由于要准备考研,博客几乎没怎么更新,游戏玩的也比较少,算上填坑、试玩、弃坑的粗略计算大概 20 款,其中不乏近年的新游戏以及一直想补的老游戏,以下是从中选出的几款个人觉得比较有的聊的作品。
勇者斗恶龙11s 寻觅逝去的时光
国民级 jrpg 系列的最新作品,各方面都非常均衡,角色构筑、战斗系统、隐藏要素的设计已经相当成熟。给我印象最深刻的还是本作的数值设计,将游戏流程的难度曲线设置的非常平缓,正常推进流程的情况下,既不会让战斗太过困难,也不会让战斗太过简单,整体战斗节奏非常舒适。剧情部分虽然较为王道,但人物性格塑造不错,能够让人代入其中,同时也有诸如人鱼的故事这样动人的剧情。
本作作为传统 jrpg 给我的感觉就是一切做的都很不错,但总感觉还差那么一口气,整体上设计还是过于保守,没有让我感到特别惊艳的地方。同时很多设计放在今天来看确实有点过时了,主要还是大量无聊的重复劳动,尽管特别的二周目剧情算是一个亮点,但也意味着要重新体验一遍几乎一样的流程,放在今天确实是很难以让人坚持的。另外本作的配乐由于大量沿用了以往作品的配乐,原创配乐不多,虽然单听确实还不错,但与游戏本身的故事结合并不 ...
LeetCode周赛总结 第327场
由于考研等因素的影响,已经时隔一年没有参加力扣周赛了,长时间没有好好琢磨算法题,思维敏捷度确实有所下降,好在这次周赛前两题都没有什么难度,但第三题却把简单问题想复杂了,第四题就基本上都没怎么读题了。。。
正整数和负整数的最大计数题目链接正整数和负整数的最大计数
解题思路直接依照题意统计该数组中正整数和负整数的个数,然后返回较大个数即可,送分题。
解题代码class Solution {
public:
int maximumCount(vector<int>& nums) {
int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i] > 0) {
++cnt1;
}
else if (nums[i] < 0) {
++cnt2;
...
用DFS解决最终幻想13-2时钟谜题
最近在补 XGP 中的最终幻想13-2时,遇到一个时钟谜题,感觉挺有意思,就像尝试用搜索算法将其解决。
问题描述如下图所示,有一个时钟,包含个结点,每个节点有一个数字标识,玩家最开始可以任意选择一个结点,选择后,该结点被消除且指针会指向该结点的位置,根据该节点的数字值 n 分裂为两根指针分别向顺时针方向和逆时针方向旋转 n 个的单位长度。此后每次玩家只能选择指针指向的结点,选择结点后结点被消除,两指针合并指向选择结点的位置并按上述描述进行分裂和旋转,玩家需要将所有节点消除才能胜利。
注:玩家无法选择已经被消除的结点,若分裂旋转后的两指针均位于已被消除的结点位置,则判定游戏失败。
算法思路本问题很容易想到利用深度优先搜索来解决,选择一个结点作为开始,如第一次选择 12 点钟位置的结点,(以下为了方便,按结点在时钟中排布位置 n 称作结点 n)该结点值为 5,则选中后分别向顺时针和逆时针方向旋转到达结点 5 和 结点 7,这就产生了两个分支(相当于二叉树的左右子树),分别选择这两个结点继续搜索,若结点到达了一个已被访问过的结点(即该结点已被消除),则终止该方向上的搜索,并进行回溯,将路 ...
Ping命令的实现
Ping (Packet Internet Groper)是一种因特网包探索器,用于测试网络连接量的程序。本文将基于 Socket 编程,实现一个基本的 Ping 命令程序。
ICMP 报文分析ICMP 报文捕获在控制台输入 ping 202.195.147.248,对该目的主机发起请求,可以看到控制台输出了一系列统计信息:4 个数据包全部接收并且往返时间为 5 ms(较短),表明与该主机之间的连接畅通。
使用 Wireshark 工具捕获 icmp 数据包,为了避免无关数据包的干扰,可以使用 filter 对数据包进行过滤,在上部栏输入 ip.src == 202.195.147.248 or ip.dst == 202.195.147.248,表明只筛选源地址或目的地址为 202.195.147.248 的数据包,最终可以得到数据包的内容。
Wireshark 数据包分析根据 ICMP 报文的格式进行分析:
Type:数据包类型,占 1 Byte,为 0x00,代表回送报文。
Code:代码部分,占 1 Byte,为 0x00.
Checksum:检验和,占 2 Byte ...