嵌入式面试常见问题(十一)—各大公司面试题

8、科大讯飞笔试题

笔试时间:2020.09.12,19:00——21:00
岗位:嵌入式软件开发
题型:四道编程题,4*10=40分

1、定义一个n*m矩阵,找到两个不在同一行同一列的数字,使得成绩最大。

2、输入一个数N,求数的二进制中1的个数(已AC)

//写一个函数返回参数的二进制中1的个数
#include<stdio.h>
#include<stdlib.h>
int count_one_bits(unsigned int value)
{
	int count = 0;
	while (value != 0)
	{
		if (value % 2 == 1)
		{
			count++;
		}
		value = value >>1;
	}
	return count;
}
int main()
{
	int num;
	int ret;
	printf("请输入一个大于0的数\n");
	scanf("%d", &num);
	ret=count_one_bits(num);
	printf("%d", ret);
	system("pause");
	return 0;
}

3、数组的排序(时间复杂度最小),应该是让你用冒泡或者选择排序。
题型是给了一种排序算法的中间过程,让你认出是哪一种排序,然后写代码。

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void sortA1(int a[], int length){
	int i, j, temp;
	for(i = 0; i < length; ++i){
	for(j = i + 1; j < length; ++j){
	if(a[j] < a[i]){ //如果后一个元素小于前一个元素则交换
	temp = a[i];
	a[i] = a[j];
	a[j] = temp;
			}
		}
	}
}
void printA1(int a[], int length){
	int i;
	for(i = 0; i < length; ++i){
		printf("%d,", a[i]);
	}
		printf("\n");
	}
void sortA2(int a[], int length){
	int i, j, temp;
	for(i = 0; i < length; ++i){
	for(j = length - 1; j > i; --j){
	if(a[j] > a[j - 1]){
	temp = a[j];
	a[j] = a[j - 1];
	a[j - 1] = temp;
			}
		}
	}
}
int main(){
	int length = 0;
	int a[] = {12, 43, 8, 50, 100, 52,0};
	length = sizeof(a) / sizeof(a[0]);
	printf("排序前\n");
	printA1(a, length);
	sortA1(a, length);
	printf("选择排序后\n");
	printA1(a, length);
	sortA2(a, length);
	printf("冒泡排序后\n");
	printA1(a, length);
	system("pause");
}

4、字符串左旋(case 20%,不知道是哪里没考虑到,读者可以尝试)
输入 1234abcd , 左旋3
输出 4abcd123

void swap(char *start, char *end)
{
while (start < end)
{
*start ^= *end;
*end ^= *start;
*start ^= *end;
start++, end--;
}

9、小马智行笔试题

笔试时间:2020.09.20,15:00——16:30
岗位:嵌入式软件工程师
题型:
单选7道
不定项选择题2道
简答1道(10分)
编程2道(60分)
单选:
1、可以作为中断使用的安全同步方式是:

A spinlock 自旋锁
B mutex 互斥量
C semaphore 信号量
D 全局变量

2、linux中改变文件属性的命令:chmod
3、linux中查找文件中匹配字符串的命令:grep
4、下列哪一种协议是靠设备地址的不同区分的:IIC
5、全局未初始化变量存在哪里:BSS段
6、代码题。

#include<stdio.h>
void change(int *,int);
int main(){
	int a=25,b=50;
	change(&a,b);
	printf("a:%d,b %d",a,b);
	return 0;
}
void change(int *x,int y){
	*x=100;
	y=200;
}

答案:100 50

提示:如果把函数写到main之前,那么就不需要声明。而且一般我们都是把main写在文件最下面。
解析:这里只有传的指针才会改变,b没有返回值。
7、代码题。

#include<stdio.h>
struct ponyai{
	char a;
	int b;
	short c;
	void *d;
};
int main(){
	struct ponyai hw;
	printf("%d\n",sizeof(hw));
	return 0;
}

64位linux下:24,内存对齐8*3=24,(void )=8
32位linux下:16,8
2,(void *)=4
在这里插入图片描述
8、答案:7

#include<stdio.h>
int main(){
	unsigned char a=2,b=5;
	printf("%d",(int)a^b);
	return 0;
}

不定项选择题:
1、OSI网络模型中,下列不属于应用层协议的是

在这里插入图片描述
2、进程间通讯:
(1)管道/无名管道(2)信号(3)共享内存(4)消息队列(5)信号量(6)socket
注意:临界区则是一种概念,指的是访问公共资源的程序片段,并不是一种通信方式。
线程通讯(锁):
(1)信号量(2)读写锁(3)条件变量(4)互斥锁(5)自旋锁

简答题:
linux内存碎片化的定义,可能的原因以及可以避免或者缓解的方式?
定义:内部碎片与外部碎片在页式虚拟存储系统中, 用户作业的地址空间被划分成若干大小相等的页面, 存储空间也分成也页大小相等的物理块, 但一般情况下, 作业的大小不可能都是物理块大小的整数倍, 因此作业的最后一页中仍有部分空间被浪费掉了. 由此可知, 页式虚拟存储系统中存在内碎片.在段式虚拟存储系统中, 作业的地址空间由若干个逻辑分段组成, 每段分配一个连续的内存区, 但各段之间不要求连续, 其内存的分配方式类似于动态分区分配.由此可知, 段式虚拟存储系统中存在外碎片

换一种问法也是一样的:
在内存管理中, “内零头”和”外零头”个指的是什么?在固定式分区分配, 可变式分区分配, 页式虚拟存储系统,段式虚拟存储系统中, 各会存在何种碎片? 为什么?
解答:
在存储管理中内碎片是指分配给作业的存储空间中未被利用的部分。
在固定式分区分配中, 为将一个用户作业装入内存, 内存分配程序从系统分区表中找出一个能满足作业要求的空闲分区分配给作业, 由于一个作业的大小并不一定与分区大小相等, 因此, 分区中有一部分存储空间浪费掉了. 由此可知, 固定式分区分配中存在内碎片.外碎片是指系统中无法利用的小存储块。
在可变式分区分配中, 为把一个作业装入内存, 应按照一定的分配算法从系统中找出一个能满足作业需求的空闲分区分配给作业, 如果这个空闲分区的容量比作业申请的空间容量要大, 则将该分区一分为二, 一部分分配给作业, 剩下的部分仍然留作系统的空闲分区。由此可知,可变式分区分配中存在外碎片

简言之:
在固定分区管理算法中, 分给程序的内存空间往往大于程序所需的空间, 这剩余部分的空间不能被其他程序所用, 这就是”内部碎片”随着存储区的分配和释放过程的进行, 在各个被分配出去的分区之间会存在很多的小空闲区, 暂时不能被利用, 这就是”外部碎片”.
避免方式:
1、依据可移动性组织页是防止物理内存碎片的一种可能方法.
2、虚拟可移动内存域避免内存碎片

编程题:
1、用C写一个function,可以获取一个文件名的宏定义。
输入 filename.h
输出 FILE_NAME_H

#include <stdbool.h>
#include <stdio.h>
#include <string.h>
char *GetFilenameDefine(char *filename, char *target_str, int
target_str_size) {
//获取头文件的宏定义字符串
}
int main() {
	char target_string[1000] = {0};
	char filename[1000] = {0};
	scanf("%s", filename);
	printf("%s\n", GetFilenameDefine(filename, target_string,sizeof(target_string)));
}

大家可以自己实现。
2、比较字符串是否相等。
case 90%,有什么我没考虑到的吗?

#include <stdbool.h>
#include <stdio.h>
#include <string.h>
bool CompareString(char *str1, char *str2) {
	// 请判断两个字符串是否相等
	int ret;
	ret = strcmp(str1,str2);
		if(ret == 0){
	return 0;
	}
	else{
	return 1;
	}
}
char str1[1000];
char str2[1000];
int main()
{
	scanf("%s", str1);
	scanf("%s", str2);
	printf("%d\n", CompareString(str1, str2));
	return 0;
}

11、商汤科技笔试题

笔试时间:2020.09.18,19:00——21:00
岗位:嵌入式软件工程师
题型:单选4道,不定项选择题2道,填空2道,编程2道。
单选:
1、在一棵二叉树上第5层的结点数最多是:16

112^0222^1342^2
第n层 2^(n-1)
//就是2的层数-1次方.

2、一根长度为a的木棒折成三段,求能构成三角形的概率:1/4

3、两堆硬币,分别为100和200枚,两人可从一堆取任意枚或从两堆取相同枚,不可以不取,取到最后一枚赢。怎么赢?(先手还是后手,后手从哪一堆取?)

4、权值为8.6.4.11的四个叶子节点构造一棵哈弗曼树,该树的带权路径长度为?
不定项选择题:
1、十进制小数55.125对应的二进制数是?
2、以下关于static说法正确的是?
回答:经典考察,另外还有const、volatile等关键字。
填空题:
1、此程序崩溃,为什么?

#include<stdio.h>
char *f()
{
	char str[512];
	sprintf(str,"AI helps world!");
	return str;
}
	int main(){
	printf("%s",f()+3);
	return 0;
}

2、求输出

#include<stdio.h>
int fun(int x,int y){
return (x>>2)*(y+4);
}
int main(){
	int a[4];
	int i = 0,value;
	a[0]=1;
	a[1]=18;
	for(i=0;i<2;i++){
	value = fun(a[i++],a[i++]);
	a[i-1]=value>>1;
	a[i-2]=value-4;
	a[i]=value;
	}
	printf("%d-%d-%d-%d",a[0],a[1],a[2],a[3]);
	return 0;
}

编程题:
1、给定一个多边形P,是一个(n,2)的数组,表示按顺序每个顶点的坐标,和一个点A(x,y),请计算点A到多边形P上的所有线段中,最短的举例的数值(点到多边形的最短距离理论)

2、有一个人在迷宫里,要从入口s抵达出口g,迷宫里的“x”表示墙壁,"."表示道路,大写字母比如A表示门,小写字母比如“a”表示钥匙。求能不能走出来?(应该是考的广度优先搜索)

  • 3
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值