岗位:嵌入式软件开发工程师(Linux方向)
题型:20 道不定项选择题,2 道编程题
1、不定项选择题
1.1
如下哪个命令可以帮助你知道 shell 的用法
- more
- help
- pwd
- man
解答:
1.2
关于差分信号的理解正确的是
- 差分信号有减少 EMI(电磁干扰)
- 差分信号能较容易地识别小信号
- 差分信号抗干扰能力较强
- 曼切斯特编码是差分信号的一种
解答:
1.3
下列说法错误的是
rm
命令可以用来删除目录comm
命令打印两个文本文件中的相同内容df
命令可以查看当前目录占用磁盘空间大小ln -s a.txt b.txt
作用是制作文件 b.txt 的符号链接,其名称为 a.txt
解答:
1.4
设已经有 A,B,C,D 4 个类的定义,程序中 A,B,C,D 析构函数调用顺序为?
C c;
void main()
{
A* pa = new A();
B b;
static D d;
delete pa;
}
- A B D C
- A D B C
- A C D B
- A D C B
解答:
1.8
一个空类的实例占用多少个字节的内存?
- 4
- 8
- 0
- 1
解答:
1.9
嵌入式系统最常用的数据传送方式是
- 查询
- I/O处理机
- DMA
- 中断
1.10
在 32 位编译环境下,以下程序运行的可能输出是
#include <iostream>
#pragma pack(push)
#pragma pack(4)
struct Foo {
char m1;
long m2;
int m3;
};
#pragma pack(pop)
int main() {
std::cout << sizeof(Foo) << std::endl;
return 0;
}
- 13
- 9
- 12
- 24
解答:
1.11
下列语句或语句组中,能正确进行字符串赋值的是
char *sp; *sp="Dream future!";
char s[20]; s="Dream future!";
char *sp="Dream future!";
char s[20];*s="Dream future!";
解答:
1.12
阅读代码选择正确的选型
#include <iostream>
class MyBase {
public:
virtual void SayHello() {
std::cout << "MyBase Hello.";
}
};
class Worker : public MyBase {
public:
MyBase() {
SayHello();
}
void SayHello() {
std::cout << "Worker Hello.";
}
};
int main() {
auto w = new Worker;
}
解答:
1.17
crontab 文件由 6 个域组成,每个域之间用空格分隔,下列哪个排列方式是正确的?
- MIN HOUR DAY MONTH DAYOFWEEK COMMAND
- COMMAND YEAR MONTH DAY HOUR MIN
- COMMAND HOUR DAY MONTH DAYOFWEEK
- MIN HOUR DAY MONTH YEAR COMMAND
解答:
1.18
关于 C 语言正确的是
int* p1;
可以这样赋值*p1=5;
- "1" 占 1 个字节
- 1 bit = 8 byte
- printf 中用到格式符 “%5s" ,如果输出字符中长度大于 5,则按原字符中长度从左往右全部输出
解答:
1.19
telnet 一个端口的时候,如何手动退出
- quit
- Exit
- ctrl+]
- ctrl+q
1.20
如下代码,正确的选项是
class A
{
public:
A() { std::cout << "a"; }
~A() { std::cout << "b"; }
A(const A&) { std::cout << "c"; }
A& operator=(const A&) { std::cout << "d"; return *this; }
};
void main() {
A a;
auto f = [=]() { A b = a; };
f();
}
- 输出字符串中,a、c 和 d 的总数与 b 数量一致;
- 输出字符串中,a 和 c 的总数与 b 数量一致;
- 输出字符串中,a 数量为 2;
- 输出字符串中,d 数量为 1;
解答:
2、编程题
2.1
题目:
示例:
- 输入:“I Am a Programmer!"
- 结果:“I mA a remmargorP!
- 函数形式如下:
char* ReverseString(char* Source)
解答:
#include <stdio.h>
#include <string.h>
// 判断字符是否为字母的函数
int isAlpha(char c) {
// 检查是否为大写字母或小写字母
if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) {
// 是字母
return 1;
} else {
// 不是字母
return 0;
}
}
// 辅助函数,用于翻转字符串中从 start 到 end 的部分
void reverseWord(char* str, int start, int end) {
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
// 主函数,用于翻转字符串中的每个单词
char* ReverseString(char* source) {
int n = strlen(source);
int start = 0;
for (int i = 0; i <= n; ++i) {
// 检查空格或字符串末尾
if (source[i] == ' ' || source[i] == '\0' || !isAlpha(source[i])) {
reverseWord(source, start, i - 1);
// 移动到下一个单词的起始位置
start = i + 1;
}
}
return source;
}
2.2
给定一个正整数 n ,你可以做如下操作:
- 如果 n 是偶数,则用 n/2 替代 n ;
- 如果 n 是奇数,则可以用 n+1 或 n-1 替换 n ;
- 返回 n 变为 1 所需的最小替换次数;
示例:
- 输入:n=8
- 输出:3
- 解释:8 -> 4 -> 2 -> 1
解答(存疑):
#include <stdio.h>
int minStepsToOne(int n) {
int steps = 0;
while (n != 1) {
// 如果是偶数,除以2
if (n % 2 == 0) {
n /= 2;
} else {
// 特殊情况:3 变为 2 或 4,选择 2 更优
if (n == 3) {
n -= 1;
// 或选择 n-1
} else {
n += 1;
}
}
steps++;
}
return steps;
}
int main() {
int n;
scanf("%d", &n);
int result = minStepsToOne(n);
printf("%d\r\n", result);
return 0;
}