2019年校招:纵目科技算法笔试题

参考
  • 一家自动驾驶AI公司—纵目科技软件、算法笔试题
  • 一家自动驾驶AI公司—纵目科技软件、算法笔试题—猫鼠问题

当时笔试感觉良好,但是遗憾没有接到面试通知,把笔试题目写出来给大家参考参考。试卷分为两部分,第一部分为必做题,第二部分选做两题


Settion 1: SW Program Questions

1、Implement the following macro to clear a 32 bit register’s bit 4,5 and 6

思路:题目要求清空二进制数指定位的值,找一个数:需要清除的位置置零,其他位置为1的数。将两个数作与操作。

参考:

#define ClrBit456(x) ((x)&0x‭FFFFFFC7‬)

2、What is problem of the following logic and how to modify it to make it work correctly?

void allocate_mem(char *str){
    Str = (char*) malloc(100);
}
void test(){
    char*str = NULL;
    allocate_mem(str);
    strcpy(str, "Hello World");
    printf(str);
}

思路:指针申请一块内存,然后将字符串拷贝到申请的内存中去,然后输出字符串。定义字符串,然后将指针指向定义的内存块,需要传地址方式或者引用方式,然后将字符串拷贝进指针所指向的内存块中。最后根据指针输出字符串。

参考答案:

void allocate_mem(char **str) {//注意str为二级指针
    *str = (char*)malloc(100);//等号右侧为指针类型,左侧也要指针类型
}
void test() {
    char *str = NULL;
    allocate_mem(&str);//引用方式传递
    strcpy(str, "Hello Word");
    printf(str);
    free(str);//最后不要忘记释放内存
}

3、Please list the system output

unsigned char a;
unsigned short b;
unsigned int c;
unsigned long d;
unsigned long long e;
unsigned int* p1, p2;
cout<< sizeof(a) << " " << sizeof(b) " " << sizeof(c) << " " << sizeof(d) << " " 
    << sizeof(e) << " " << sizeof(p1) << " " << sizeof(p2);

Complied and run by 32bit complier
Complied and run by 64bit complier

思路:本题目考察关于32位和64位系统中常见变量的存储长度。为了跨平台的兼容性,常见的变量长度都不变,变化的为:* 指针(4/8)、long(4/8)、unsigned long(4/8)。之所以p2不变是因为两个地方都是int而不是int*

参考:

complier char short int long long long int* p1 p2
32 1 2 4 4 8 4 4
64 1 2 4 8 8 8 4

4、Please list the system output: TODO

unsigned char a = 128;
unsigned int b = ( a << 8 ) & ( a++ ) || (++a);

思路:首先分析unsigned char a=128;二进制为:1000 0000; a<<8左移8位溢出,和a作与操作,结果为0,0再和++a作或,因为a非0,结果为1。b=1;因为a自加了两次,故由128变为130;

a=130
b=1

5、有一只猫在半径为r的圆周上以速度为v移动,猫只能在圆周上移动, 但可以自由改变方向。 圆心位置有一只老鼠。 老鼠可以在圆内自由移动, 但速度仅为 v/4。 老鼠按照什么样的策略/路线可以逃逸圆周而不被捕获。

思路:
1首先计算直接朝外跑,看老鼠跑R这么远,猫在同样时间能否比半个圆周短,如果老鼠跑R的时间,猫跑在同样的时间内跑的超过半个圆周,那么行不通。其实毫无疑问是行不通的,不然题目就没有意义了。
2、我们知道,老鼠虽然速度慢,但是如果老鼠围绕着内圈跑,猫绕着外圈跑,不一定会比猫慢(弧度)。可以找到二者跑同样的弧度的情况下,看此时老鼠离圆心多远,然后看此时再直接朝圆外跑,能不能跑出去,经过计算式可以跑出去的。




Settion 2: SW Program Questions

1、implement the following 2 functions.
  • Use the ANSI malloc and free functions for actual mermory allocation.
  • Pointer returned by Alloc64Aligned shall be 64 byte aligned.
  • Do not use global variables in your logic.
void * Alloc64Aligned (int nSize)
void Free64Aligned ( void * p )

思路:
不让自己写内存分配函数;Alloc64Aligned返回的指针必须是64字节对齐;不让用全局变量;

参考代码:

void * Alloc64Aligned (int nSize){
	char *ret;
	int block; 
	int offset;
	int i;
	if (size<=0){
		return NULL;
	}
	block=1+size/8; 
	ret=(char *)malloc(block*8);
	offset=((unsigned long)ret)%8;
	ret[0]=0;
	for (i=1;i<8-offset;++i){
		ret[i]=1;
	}
	return ret+8-offset;
}
void Free64Aligned ( void * p ){
	char *buf;
	int i;
	if (p==NULL){
		return ;
	}
	buf=(char *)p;
	for (i=1;i<8;++i){
		if (*(buf-i)==0){
			break;
		}
	}
	free(buf-i);
}

2、实现一个函数,计算兔子的数量
有一对兔子,从出生后第3个月起每生一对兔子,小兔子长到第三个月后又生一对兔子,假设兔子都不死,问第n个月兔子的总数为多少?

思路:经典的斐波那契数列问题

int CalculateRabbitCount(int Num){
	int temp[32],i;
	temp[0]=1,temp[1]=1;
	for (i=2;i

3、实现以下 random_sort 的函数, 对输入的数组做随机排序
rand函数是已知库函数, 可以返回0到1之间的一个浮点数;array 是输入的一个递增数组, size是数组的长度。 函数返回时的结果也存在array的数组中。

float rand(); // return random value, 0 <= random value < 1
void random_sort(int* array, int size)

参考代码:

void random_sort(int* array, int size){
	int i,p,e;
	for (i=0;i

4、实现以下程序,对一帧8位灰度图实现双线性拉伸
src_bud是传入图像, dst_buf是传出图像, src_width, srdc_height 是传入图像的宽高, dst_width, dst_height 是传出图像的宽高
双线性拉伸的定义: 当需要计算P 点的值的时候, P点的值等于分别到最临近的 A, B, C, D四个点的值乘以距离的加权平均。

void bilinear_interpotation(unsigned char* src_buf,
                            int src_width,
                            int src_height,
                            unsigned char* dst_buf,
                            int dst_width,
                            int dst_height)

参考代码:




你可能感兴趣的:(算法)