当前位置: 首页 > news >正文

嵌入式软件工程师面试题——2025校招专题(四)

说明:

  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!

1.递归函数mystrlen(char *buf, int N)是用来实现统计字符串中第一个空字符前面字符长度

例如:字符串buf,当输入N=10或者20,期待输出结果是6;当输入N=3或5,期待输出结果是3
或5。

char buf[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0', 'x', 'y', 'z'};

答案

#include <iostream>
using namespace std;int mystrlen(char *buf, int N)
{if(buf[0] == 0 || N == 0) // 如果空字符出现,返回0return 0; else if(N == 1) // 如果字符长度为1,返回1return 1; int t = mystrlen(buf, N/2); // 折半递归取长度if(t < N/2) // 如果长度小于输入N值的一半,取当前长度return t;else    // 反之取下面一个祖父并继续递归return (t + mystrlen(buf + N/2, (N+1)/2));}int main()
{char buf[] = {'a', 'b', 'c', 'd', 'e', 'f', '\0', 'x', 'y', 'z'};int k;k = mystrlen(buf, 20);cout << k << endl;return 0;
}

2.算法从一个等边三角形开始,在随后的每次迭代中,在外部添加新的三角形。n的前三个值的结果如下图所示。在经过100次迭代之后,会有多少个小三角形?

在这里插入图片描述
A.19800
B.14501
C.14851
D.14702

解析
本题规律如下,新增加的小三角形数目为3*(n-1)
f(1)=1;
f(2)=f(1)+3 * (2-1);
f(3)=f(2)+3 * (3-1);

f(n)=f (n-1)+3 * (n-1)

答案:C

3.这段代码的输出结果为?

#include <iostream>
#include <string>
using namespace std;int main()
{int x = 10, y = 10, i;for(i=0; x > 8; y=i++){printf("%d %d ", x--, y);}return 0;
}

A.10,0,9,1
B.10,10,9,0
C.10,1,9,2
D.9,10,8,0

解析
for循环括号内被两个分号分为3部分:i=0是初始化变量;x>8是循环条件,也就是只要x>8就执行循环;那y=i++是什么?在第一次循环时执行了么?
答案是不执行,y=i++实际上是个递增条件,仅在第二次循环开始时才执行。
所以结果是10,10,9,0。
答案:B
题目变形:

int main()
{int x = 10, y = 10, i;for(i=0; x > 8; ){   y=i++;printf("%d %d ", x--, y);   // 10 0 9 1}return 0;
}

4.有两等长数组A、B,所含元素相同,但顺序不同,只能取得A数组某值和B数组某值进行比较,比较结果为大于、小于或等于,但是不能取得同一数组A或B中的两个数组进行比较,也不能取得某数组中的某个值。写一个算法实现正确匹配

答案

#include <iostream>
using namespace std;void matching(int a[], int b[], int k)
{int i = 0;while(i <= k-1){int j = 0;while(j <= k-1){if(a[i] == b[j]){cout << "a[" << i << "]" << "match" << "b[" << j << "] " << endl;break;}j++;}i++;}cout << endl;
}int main()
{int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};int b[10] = {10, 6, 4, 5, 1, 8, 7, 9, 3, 2};int k = sizeof(a) / sizeof(int);matching(a, b, k);return 0;
}

5.介绍一下STL和包容器,如何实现?举例实现vector

答案
C++的一个新特性就是采用了标准模板库(STL)。所有主要编译器销售商现在都把标准模板库作为编译器的一部分进行提供。标准模板库是一个基于模板的容器类库,包括链表、列表、队列和堆栈。标准模板库还包含许多常用的算法,包括排序和查找。
标准模板库的目的是提供对常用需求重新开发的一种替代方法。标准模板库已经经过测试和调试,具有很高的性能并且是免费的。最重要的是,标准模板库是可重用的。当你知道如何使用一个标准模板库的容器以后,就可以在所有的程序中使用它而不需要重新开发了。
容器是包容其他对象的对象。标准C++库提供了一系列的容器类,它们都是强有力的工具,可以帮助C++开发人员处理一些常见的编程任务。标准模板库容器类有两种类型,分别为顺序和关联。顺序容器可以提供对其成员的顺序访问和随机访问。关联容器则经过优化关键值访问它们的元素。标准模板库在不同操作系统间是可移植的。所有标准模板库容器类都在namespace std中定义。
举例实现vector如下:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main() {// 创建一个空的 vectorvector<int> vec;// 检查 vector 是否为空if (vec.empty()) {cout << "Vector is empty" << endl;}// 添加元素到 vectorvec.push_back(10);vec.push_back(20);vec.push_back(30);// 获取 vector 的大小cout << "Vector size: " << vec.size() << endl;// 访问 vector 中的元素cout << "Elements in vector: ";for (const auto& element : vec) {cout << element << " ";}cout << endl;// 修改 vector 中的元素vec[1] = 50;// 删除 vector 中的最后一个元素vec.pop_back();// 插入元素到指定位置vec.insert(vec.begin() + 1, 100);// 删除指定位置的元素vec.erase(vec.begin() + 2);// 判断指定元素是否存在于 vector 中int searchElement = 50;auto iter = find(vec.begin(), vec.end(), searchElement);if (iter != vec.end()) {cout << searchElement << " found in vector" << endl;} else {cout << searchElement << " not found in vector" << endl;}// 清空 vectorvec.clear();// 检查 vector 是否为空if (vec.empty()) {cout << "Vector is empty" << endl;}return 0;
}

6.解释一下什么是泛型编程,泛型编程和C++及STL的关系是什么?并且,你是怎么在C++环境里进行泛型编程的?

答案
泛型编程是一种编程方式,它允许我们编写可以适用于多种数据类型的代码。通过使用模板技术,泛型编程可以实现高度重用性和通用性,从而提高代码的可维护性和扩展性。
在 C++ 中,泛型编程被广泛应用于标准模板库(STL)中。STL 是 C++ 标准库的一部分,包含了许多常用的容器、算法和迭代器等组件。这些组件都是使用泛型编程技术实现的,因此可以适用于不同的数据类型,从而提高了代码的重用性和可扩展性。
在 C++ 环境中,进行泛型编程需要使用模板技术。C++ 的模板是一种通用的编程机制,它允许我们编写可以适用于多种数据类型的代码。通过使用模板,我们可以将函数或类定义为通用的,从而可以在不同的数据类型上进行操作。
例如,下面是一个简单的模板函数示例,用于比较两个值的大小:

template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}

在上述示例中,max 函数使用了模板技术,其中 表示这是一个通用的模板函数,可以适用于不同的数据类型。在函数体中,我们比较了两个值的大小,并返回其中较大的值。

当我们需要使用该函数时,可以将不同类型的参数传递给它,例如:

int a = 10, b = 20;
std::cout << "max(a, b) = " << max(a, b) << std::endl;double c = 3.14, d = 2.71;
std::cout << "max(c, d) = " << max(c, d) << std::endl;

在上述示例中,我们分别使用了 int 和 double 类型的参数调用了 max 函数,从而实现了泛型编程。

总之,泛型编程是一种强大的编程技术,可以提高代码的重用性和可扩展性。在 C++ 中,STL 是一个优秀的泛型编程库,可以帮助我们更加高效地开发各种应用程序。在进行泛型编程时,需要使用模板技术来实现通用性,从而可以适用于不同的数据类型。

7.下面哪个些关键字与封装相关?

A.virtual
B.void
C.interface
D.private
E.all of the above
解析
什么是封装?
从字面意思来看,封装就是把一些相关的东西打包成一“坨”。封装最广为人知的例子,就是在面向对象编程里面,把数据和针对该数据的操作,统一到一个class里。
很多人把封装的概念局限于类,认为只有OO中的class才算是封装。这实际上是片面的。在很多不使用“类”的场合,一样能采用封装的手法:
(1)通过文件。
比如C和C++支持对头文件的包含(#include)。因此,可以把一些相关的常量定义、类型定义、函数声明,统统封装到某个头文件中。
(2)通过namespace/package/module。
C++的namespace、Java的package、Python的module,这些语法虽然称呼各不相同,但具有相同的本质。因此,也可以利用这些语法来进行封装。那么封装有一个主要的好处,就是增加软件代码的内聚性。通过增加内聚性,进而提高可复用性和可维护性。此外还可以“信息隐藏”:把不该暴露的信息藏起来。如private、protected之类的关键字。这些关键字可以通过访问控制,来达到信息隐藏的目的。
本题中,interface属于继承,virtual属于多态,private才是与封装相关。
答案:D

8.C++中的空类默认产生哪些类成员函数?

答案
对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。

9.哪一种成员变量可以在同一个类的实例之间共享?

答案
在同一个类的实例之间,静态成员变量是可以共享的。静态成员变量属于类本身而不是类的实例,因此它们在类的所有实例之间共享相同的值。
当我们声明一个静态成员变量时,无论创建多少个类的实例,都只有一个静态成员变量的副本存在。这意味着对静态成员变量的修改会影响到所有实例。
以下是一个示例代码,演示了静态成员变量的共享特性:

#include <iostream>class MyClass {
public:static int sharedVariable;
};int MyClass::sharedVariable = 0; // 静态成员变量的定义和初始化int main() {MyClass obj1;MyClass obj2;obj1.sharedVariable = 10;std::cout << "obj1.sharedVariable: " << obj1.sharedVariable << std::endl;std::cout << "obj2.sharedVariable: " << obj2.sharedVariable << std::endl;obj2.sharedVariable = 20;std::cout << "obj1.sharedVariable: " << obj1.sharedVariable << std::endl;std::cout << "obj2.sharedVariable: " << obj2.sharedVariable << std::endl;return 0;
}

10.这个类声明正确吗?为什么?

class A {const int Size = 0;
};

答案
这道程序题存在着成员变量问题。常量必须在构造函数的初始化列表里面初始化或者将其设置成static。

// 方式1
class A {A() {const int Size = 0;}
};// 方式2
class A {static const int Size = 0;
};

11.析构函数可以为virtual型,构造函数则不能。那么为什么构造函数不能为虚呢?

答案
构造函数不能为虚函数的主要原因是在对象创建时,虚函数表还没有被创建。虚函数表是在对象创建后才被创建的,它存储了类的虚函数的地址。因此,在对象创建期间,调用虚函数是不可能的。

在 C++ 中,当我们创建一个对象时,会先分配内存空间,然后调用构造函数来初始化该对象。在构造函数执行期间,对象的虚函数表还没有被创建,因此无法调用虚函数。如果将构造函数声明为虚函数,那么编译器也无法确定应该调用哪个虚函数,因为虚函数表还没有被创建。另外,虚函数的调用需要使用虚函数表,这会带来一定的额外开销。但是,由于构造函数在对象创建时只会被调用一次,因此将构造函数声明为虚函数并不能带来性能上的优势,反而会增加额外的开销。

因此,C++ 标准规定,构造函数不能为虚函数。而析构函数可以为虚函数,因为在对象销毁时,虚函数表仍然存在,可以通过虚函数表来调用析构函数,从而保证正确的析构顺序。

12.析构函数可以是内联函数吗?

答案
析构函数可以是内联函数。在 C++ 中,我们可以使用 inline 关键字将函数声明为内联函数。
内联函数是一种编译器优化的手段,它的作用是将函数的定义插入到调用它的地方,而不是通过函数调用的方式执行。这样可以减少函数调用的开销,提高程序的执行效率。
对于简单且频繁调用的函数,通常会将其声明为内联函数。析构函数通常是在对象销毁时自动调用的,因此对于小型、简单的类,将析构函数声明为内联函数是合理的
要将析构函数声明为内联函数,只需在类定义中的析构函数声明前加上 inline 关键字即可,例如:

class MyClass {
public:inline ~MyClass(); // 内联析构函数的声明
};inline MyClass::~MyClass() {// 析构函数的定义// ...
}

需要注意的是,虽然将析构函数声明为内联函数可以提高程序的执行效率,但并不是所有情况下都适合将析构函数声明为内联函数。如果析构函数的实现较为复杂或包含大量代码,那么将其声明为内联函数可能会导致代码膨胀,反而降低了性能。因此,在决定是否将析构函数声明为内联函数时,需要综合考虑函数的复杂性和调用频率。

相关文章:

嵌入式软件工程师面试题——2025校招专题(四)

说明&#xff1a; 面试题来源于网络书籍&#xff0c;公司题目以及博主原创或修改&#xff08;题目大部分来源于各种公司&#xff09;&#xff1b;文中很多题目&#xff0c;或许大家直接编译器写完&#xff0c;1分钟就出结果了。但在这里博主希望每一个题目&#xff0c;大家都要…...

actual combat 21——华为云从零开始项目部署(附nginx转发域名方式)

一、IP地址方式&#xff1a; 后端&#xff1a; 确保项目本地跑通建立并运行华为云流水线 前端&#xff1a; 打包&#xff08;测试环境&#xff09;手动上传 nginx&#xff1a; 配置一下即可 华为云&#xff1a; 安全组&#xff1a;暴露后端网关端口安全组&#xff1a;暴…...

@CallSuper注解方法学习

CallSuper注解是什么&#xff1f; CallSuper 是 Android 开发中使用的一个注解&#xff0c;它的主要用途是确保在子类重写父类的方法时&#xff0c;调用 super 方法。这在某些情况下是非常有用的&#xff0c;例如当你希望在重写方法时保留父类的默认行为&#xff0c;或者确保子…...

03_Flutter自定义下拉菜单

03_Flutter自定义下拉菜单 在Flutter的内置api中&#xff0c;可以使用showMenu实现类似下拉菜单的效果&#xff0c;或者使用PopupMenuButton组件&#xff0c;PopupMenuButton内部也是使用了showMenu这个api&#xff0c;但是使用showMenu时&#xff0c;下拉面板的显示已经被约定…...

如何查看多开的逍遥模拟器的adb连接端口号

逍遥模拟器默认端口号为&#xff1a;21503。 不过&#xff0c;使用多开器多开的时候&#xff0c;端口就不一定是21503了。 如何查看&#xff1f; 进入G:\xiaoyao\Microvirt\MEmu\MemuHyperv VMs路径中 每多开一个模拟器&#xff0c;就会多出一个文件夹。 进入你要查找端口号…...

2023年中国道路扫雪车分类、市场规模及发展前景分析[图]

道路扫雪车是一种专门用于清除道路上积雪和冰雪的机动车辆&#xff0c;通常配备有雪铲、扫雪刷、除冰剂喷洒系统等装置&#xff0c;用于在雪季或寒冷气候条件下&#xff0c;对道路进行清扫、除雪、除冰等作业&#xff0c;以确保道路的通行安全。 道路扫雪车行业分类 资料来源&…...

【机器学习】迁移学习(Transfer)详解!

1. 什么是迁移学习 迁移学习(Transfer Learning)是一种机器学习方法&#xff0c;就是把为任务 A 开发的模型作为初始点&#xff0c;重新使用在为任务 B 开发模型的过程中。迁移学习是通过从已学习的相关任务中转移知识来改进学习的新任务&#xff0c;虽然大多数机器学习算法都是…...

软件测试面试题

软件测试面试时一份好简历的重要性 软件的生命周期&#xff08;prdctrm&#xff09; 计划阶段&#xff08;planning&#xff09;-〉需求分析&#xff08;requirement&#xff09;-〉设计阶段&#xff08;design&#xff09;-〉编码&#xff08;coding&#xff09;->测试&am…...

分治算法解决归并排序问题

分治算法定义&#xff1a;分治算法是一种问题解决方法&#xff0c;它将一个大问题划分为多个相同或相似的子问题&#xff0c;然后递归地解决这些子问题&#xff0c;最后将子问题的解合并得到原问题的解 作用&#xff1a; 排序算法分治算法在排序算法中得到广泛应用。例如&…...

Spring Security漏洞防护—HttpFirewall和 HTTPS

一、HttpFirewall Spring Security有几个领域&#xff0c;你所定义的 pattern 会针对传入的请求进行测试&#xff0c;以决定应该如何处理请求。这发生在 FilterChainProxy 决定请求应该通过哪个过滤链时&#xff0c;以及 FilterSecurityInterceptor 决定哪些安全约束适用于请求…...

Makefile泛谈

Makefile工作原理 1、检查规则中的依赖文件是否存在。 2、若依赖文件不存在&#xff0c;则寻找是否有规则用来生成该依赖文件。 譬如&#xff0c;执行文件会先寻找.o文件是否存在&#xff0c;如果不存在&#xff0c;就会再寻找是否有规则可以生成该依赖文件。如果缺少了main.…...

Python的快捷键

Python Python使用的小快招关于注释关于格式写主函数如何看函数源代码 Python使用的小快招 本文主要记录了写python代码的时候提高效率的一些小妙招 关于注释 选中要注释的代码&#xff0c;然后按下Ctrl /即可对多段代码注释。 关于格式 对于python代码的格式&#xff0c…...

css为盒子设置滚动条隐藏滚动条

省流&#xff1a;为盒子设置宽高&#xff0c;设置滚动条方向&#xff0c;隐藏滚动条。 首先&#xff0c;要为需要添加滚动条的盒子设置固定的高度和宽度&#xff0c;这样才能让内容超过盒子的边缘。 .box {width: 300px;height: 300px; }然后&#xff0c;给盒子加入overflow属…...

音视频开发常见问题(四):视频花屏和绿屏

摘要 本文介绍了视频视频花屏/绿屏问题的常见原因&#xff0c;如丢失关键帧、metadata的变化、硬件编解码的兼容性问题和颜色格式不一致问题。以及排查方法和解决策略&#xff0c;包括检查视频数据格式、排查自采集/自渲染模块问题、联系第三方音视频SDK技术支持等。最后&…...

设计模式—创建型模式之单例模式

设计模式—创建型模式之单例模式 介绍 单例模式说明&#xff1a;一个单一的类&#xff0c;负责创建自己的对象&#xff0c;同时确保系统中只有单个对象被创建。 单例模式特点&#xff1a; 某个类只能有一个实例&#xff1b;&#xff08;构造器私有&#xff09;它必须自行创…...

7.现代卷积神经网络

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 深度卷积神经网络 AlexNet一、AlexNet二、D2L代码注意点三、QA No.2 使用块的网络 VGG一、VGG二、D2L代码注意点三、QA No.3 网络中的网络 NiN一、NIN二、D2L代码注意点三、QA No.4 含并行连结的网络 GoogLeNet / Incep…...

配置Super-VLAN下的DHCP服务器示例

组网需求 如图1所示&#xff0c;某公司拥有两个部门&#xff0c;为了节省IP地址&#xff0c;部门A和部门B规划为同一网段&#xff1b;为了提升业务安全性&#xff0c;将不同部门的用户划分到不同VLAN中。企业管理员为了方便统一管理&#xff0c;希望部门内终端通过DHCP服务器动…...

【开源】基于SpringBoot的城市桥梁道路管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统&#xff0c;支持…...

关于根据动态数量的对象的某属性的数组数量呈乘机式增长的数据处理

adta是原始数组,currentIndex默认是零,currentObject初始对象,result处理生成的结果 function generateObjects(data, currentIndex, currentObject, result) {if (currentIndex data.length) {result.push(currentObject);return;}const currentCode data[currentIndex].co…...

数据分析和互联网医院小程序:提高医疗决策的准确性和效率

互联网医院小程序已经在医疗领域取得了显著的进展&#xff0c;为患者和医疗从业者提供了更便捷和高效的医疗服务。随着数据分析技术的快速发展&#xff0c;互联网医院小程序能够利用大数据来提高医疗决策的准确性和效率。本文将探讨数据分析在互联网医院小程序中的应用&#xf…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...