2015先锋(笔试-面试-复试)

本文详细记录了一次技术面试的经历,包括笔试环节考察C语言基础、内存管理、树、森林、堆栈等算法,面试环节则侧重于细节问题和Linux驱动相关知识,以及对utf8变长编码进行字符数统计的编程题解答。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说说流程吧,下午到那边后,立即做题,做到3点左右,笔试过了,就立刻安排面试,给我面试的哥们感觉跟我年龄差不多,大概免了一个小时吧,最后一个应该是公司主管吧,又免了一个小时,累呀。。。不过说效率真的很高,最后等通知。


笔试环节:

主要考C语言基础,内存管理,树,森林,堆栈等算法,100分试卷,比较头疼的是不定项选择,单选还好。一般的基础好点,都能过掉这关。


面试环节:

考的好细节,以前写程序没考虑过的问题,都会问你,我把题目整理下:大概是67个题目吧

1,定义函数指针,里面有两个参数(int,char *),返回值为整形

      实在是没听懂面试官说的意思,可能是刚做完笔试题,头晕晕的,考点是#define  和 typedef。

2,考linux驱动相关的一些基础命令,比如加载驱动的两个命令,卸载驱动等

      这个平时写程序用到的命令,应该都会过的。

3,linux中重要的三个结构体,关系

       file_operation,node,file,这个关系我说的不好,file_operation就是把系统调用和驱动程序关联起来的关键数据结构;struct file代表一个打开的文件,在执行file_operation中的open操作时被创建;struct inode被内核用来代表一个文件,注意和struct file的区别,struct inode一个是代表文件,struct file一个是代表打开的文件;通过inode可以设备号;

4,字符串翻转,不申请额外空间

       引申:"I AM STUDENT"  =>  ''STUDENT AM I"  怎么实现?

       很简单,先整体翻转,在局部翻转;

5,linux驱动中,close(),release(),区别;

      release对应的就是close函数,对某些设备,当用户使用close时,最终会调用release函数,实际上open和release不需要具体实现什么,一般会作为一个计数,就是有多少人次访问该设备,也可以通过open和release实现同一时间只能有一个用户访问该设备等等。内核驱动没有close,release相当于close,对于open,当关闭文件时调用release。

6,用什么方法可以实现二叉树的先序遍历;

    用栈,要考虑出栈,入栈


复试环节:

首先跟你聊聊想去哪里工作,你的毕业课题,目前在座的工作,为什么来到这个公司,最后完成一个编程题:

对于utf8变长编码,统计字符数;

例如:输入 aaa a韩国

           输出  count = 7


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>
#include <stdio.h>

static int Fd_TextFile;
static unsigned char *TextFileMem;
static unsigned char *TextFileStart;
static unsigned char *TextFileMemEnd;
static int count = 0;
static int ilen_head = 3;

static int GetPreOneBits(unsigned char ucVal)
{
	int i;
	int j = 0;
	
	for (i = 7; i >= 0; i--)
	{
		if (!(ucVal & (1<<i)))
			break;
		else
			j++;
	}
	if(j == 0)
		j = 1;
		
	return j;

}

int main(int argc,char *argv[])
{
	struct stat tStat;
	int iNum;
	unsigned char ucVal;

	Fd_TextFile = open(argv[1], O_RDONLY);
	if (0 > Fd_TextFile)
	{
		printf("can't open text file %s\n", argv[1]);
		return -1;
	}

	if(fstat(Fd_TextFile, &tStat))
	{
		printf("can't get fstat\n");
		return -1;
	}
	
	TextFileMem = (unsigned char *)mmap(NULL , tStat.st_size, PROT_READ, MAP_SHARED, Fd_TextFile, 0);
	if (TextFileMem == (unsigned char *)-1)
	{
		printf("can't mmap for text file\n");
		return -1;
	}
	
	TextFileMemEnd = TextFileMem + tStat.st_size;
	
	TextFileStart = TextFileMem + ilen_head;
	
	while(1)
	{	
		ucVal = *TextFileStart;
		iNum  = GetPreOneBits(ucVal);
		//printf("iNum = %d \n",iNum);
		
		count += 1;
		
		if ((TextFileStart + iNum) >= TextFileMemEnd)
		{
			/* 文件结束 */
			printf("count = %d \n",count);
			return count;
		 }
		
		 if (TextFileStart >= TextFileMemEnd)
		 {
			/* 文件结束 */
			printf("count = %d \n",count);
			return count;
		 }
		
		TextFileStart += iNum;
			
	} 
	
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值