杭州天丽笔试题

1.volatile关键字的作用,举三个应用实例。

一般说来,volatile用在如下的几个地方:

1、中断服务程序中修改的供其它程序检测的变量需要加volatile;

2、多任务环境下各任务间共享的标志应该加volatile;

3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能有不同意义;

2.定义一个返回值和参数都是函数指针的函数

typedef void (*p)(void)

p func(p p1);

或是:void (*) (void)  func( void (*) (void))

void (*func(void (*p) (void))(void);

3.内存中的大小端模式?

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

4.排序算法有哪几种?用C实现冒泡排序

void sort(int arr[],int size){

//1.外层循环控制比较的轮数

//2.内层循环控制每轮比较的下标范围

int i=0,j=0;

for(i=0;i<size-1;i++){

for(j=0;j<size-i-1;j++){

if(arr[j]>arr[j+1]){

int temp=arr[j];

arr[j]=arr[j+1];

arr[j+1]=temp;

}

}

}

}

常用的排序算法

2.1冒泡排序

相邻位置之间元素的比较

(1)算法流程

a.比较相邻位置的元素,如果左边的比右边的大,则交换两个元素的位置

b.针对每一对相邻位置的元素都重复上一步,从第一对到最后一对比较完毕

经过这一步,最后的元素就是这组数中的最大值

c.针对所有的元素重复以上步骤,每次对越来越少的元素进行比较,直到没有

可以交换的元素为止

(2)算法评价

平均时间复杂度o(n^2),稳定,对样本的有序性比较敏感

2.2插入排序

(1)算法的流程

a.从第一个元素起,假定这个元素已经有序

b.从第二个元素起,与已经有序的元素从后向前进行比较

c.如果左边的元素大于取出的元素,则将左边的元素赋值到下一个位置上

继续与有序的元素进行比较

d.如果左边的元素小于取出的元素,则将取出的元素插入到左边元素之后

e.重复以上步骤,直到处理完所有的元素

(2)算法评价

平均时间复杂度o(n^2),稳定,对样本的有序性比较敏感,但是赋值的次数

比冒泡排序少,所以略优于冒泡排序

2.3选择排序算法

(1)算法的流程

a.从第一数起依次取出所有元素,假定取出的元素是最小值,记录下标

b.使用假定的最小元素和后续元素依次进行比较,如果后续元素中有比

假定最小元素还小的元素,则重新记录下标,后续元素成为了假定的最小数

c.直到假定的最小元素和后续所有元素比较完毕,交互最新的最小元素和

开始假定的最小元素

d.重复上述过程,直到所有元素排序完毕

(2)算法评价

平均时间复杂度o(n^2),不稳定,对样本的有序性不敏感,比较的次数的比较多

交换的次数比较少,一般情况下略优于冒泡排序

2.4快速排序

(1)算法的流程

a.选择一个中间元素作为基准值,单独存储起来

b.依次分别使用左边元素和右边元素和基准值比较,将比基准值小的元素放在左边

将比基准值大或者相等的元素放在右边,

c.重复以上过程,直到两边元素的下标重合为止,将基准值放到重合的位置上,此时

比基准值小的元素已经到了基准值左边,比基准值大的元素已经在基准值的右边

d.用递归的方式对基准值左边和右边的元素分别进行分组排序

(2)算法评价

平均时间复杂度o(NlogN)不稳定,如果每次分配都能做到均匀划分,这种情况的排序速度最快

5.ISR中断服务子程序的错误:

ISR不能有返回值;

ISR不能传递参数;

ISR应该是短而高效的,在ISR中做浮点运算是不明智的;

ISR中不应该有重入和性能上的问题,因此不应该使用printf()函数。

__interrupt double compute_area (double radius)

{

double area = PI * radius * radius;

printf("\nArea = %f", area);

return area;

}

1)  ISR 不能返回一个值。如果你不懂这个,那么你不会被雇用的。

2)  ISR 不能传递参数。如果你没有看到这一点,你被雇用的机会等同第一项。

3)  在许多的处理器/编译器中,浮点一般都是不可重入的。有些处理器/编译器需要让额外的寄存器入栈,有些处理器/编译器就是不允许在ISR中做浮点运算。

此外,ISR应该是短而有效率的,在ISR中做浮点运算是不明智的。

4) 与第三点一脉相承,printf经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被雇用前景越来越光明了。

6.while(1) ,for(; ;),goto死循环用哪个?为什么

一般for(;;)性能更优

for(;;)

{}

这两个;; 空语句,编译器一般会优掉的,直接进入死循环

while(1)

{}

每循环一次都要判断常量1是不是等于零,在这里while比for多做了这点事

不过从汇编的角度来说,都是一样的代码。

goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时,用goto语句则比较合理。

7.抢占式内核和非抢占式内核?

内核抢占(可抢占式内核):

即当进程位于内核空间时,有一个更高优先级的任务出现时,如果当前内核允许抢占,则可以将当前任务挂起,执行优先级更高的进程。

非抢占式内核:

高优先级的进程不能中止正在内核中运行的低优先级的进程而抢占CPU运行。进程一旦处于核心态(例如用户进程执行系统调用),则除非进程自愿放弃CPU,否则该进程将一直运行下去,直至完成或退出内核。

抢占式内核的意义:

首先,这是将Linux应用于实时系统所必需的。实时系统对响应时间有严格的限定,当一个实时进程被实时设备的硬件中断唤醒后,它应在限定的时间内被调度执行。而Linux不能满足这一要求,因为Linux的内核是不可抢占的,不能确定系统在内核中的停留时间。事实上当内核执行长的系统调用时,实时进程要等到内核中运行的进程退出内核才能被调度,由此产生的响应延迟,在如今的硬件条件下,会长达100ms级。这对于那些要求高实时响应的系统是不能接受的。而可抢占的内核不仅对Linux的实时应用至关重要,而且能解决Linux对多媒体(video, audio)等要求低延迟的应用支持不够好的缺陷。

时间: 2024-08-08 14:21:30

杭州天丽笔试题的相关文章

经典的阿里前端笔试题

1 请说明下面各种情况的执行结果,并注明产生对应结果的理由. function doSomething() { alert(this); } ① element.onclick = doSomething,点击element元素后. ② element.onclick = function() {doSomething()}, 点击element元素后. ③ 直接执行doSomething(). 参考答案: 1.element:调用执行时直接指向事件元素. 2.window:函数调用中的 thi

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

腾讯web前端开发工程师笔试题及答案

1. 如何实现事件委托? 首先要知道什么是事件委托. 考虑一个列表,在li的数量非常少的时候,为每一个li添加事件侦听当然不会存在太多性能方面的问题,但是当列表非常的长,长到上百上千甚至上万的时候(当然只是一个解释,实际工作中很少遇到这么多li的情况),为每个li添加事件侦听就会对页面性能产生很大的影响. 就像下面这段代码: <!DOCTYPE HTML><html><head><meta charset="utf-8" /><ti

ThoughtWorks笔试题之Merchant&#39;s Guide To The Galaxy解析

一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天HR就打开电话,基本了解了一下情况(工作环境不错,男人妹子比例:1:1,双休,六险一金,满一年年假15天,病假8天,月薪1W--2W).然后立马收到一封:Coding Assignment的笔试题目.网上搜索了一下,发现这个公司还是挺大的,公司面试流程是出了名的繁杂和苛刻.据说有8轮:电话面试=>笔试=>Homework=>结对编程(中午管饭)=>技术面试=>PM面试=>

java各公司笔试题集1

IBM笔试题 注:IBM笔试题一小时之内完成,题目全部用英文描述,这里用中文表述 一.名词解释 1.Eclipse 2.J2EE 3.EJB 4.Ajax 5.Web service 二.找出以下代码问题 public class test{ public void print(String str){ char[] s=str: } } public class a{ public static void main(String [] args){ puts() } } 三.写出以下输出 pu

腾讯笔试题:满二叉排序树,任给3个子节点,找他们最大的公共父节点

腾讯笔试题出现了和这个类似的题目,没做出来,现在来好好解决这个问题吧,先从基本的开始. 先吐槽一下:感觉算法设计什么的,真的超级难,也许是我头脑太笨,转不过弯来吧,呵呵. 题目是这样的:一棵满二叉排序树,有K层,节点的值依次为 1~2k-1.现在告诉你树的高度是4层,给定你3个节点,比如9,11, 13,那么最大的公共父节点是12. 现在想起来这题我已经想出来一半了呀,但是大概人在紧张的时候大脑会思维短路,跳不出原有的思维陷阱.想法是这样的: 1. 首先是从根节点开始,如果给的三个叶节点的值其中

2017CVTE笔试题

下面是凭记忆整理的2017CVTE校招笔试题,基本上全都是我不会或很模糊的题,为了更好突出重点我以问答题的形式来描述题目. 1. 中序遍历是属于层次遍历.广度优先遍历.深度优先遍历中的哪一种? 答:层次遍历是指一层一层的遍历树中的节点,广度优先遍历是指遍历完它所有的兄弟节点后再开始遍历其孩子节点,因此层次遍历也属于广度优先遍历.深度优先遍历就是顺着节点的孩子节点一直往下搜索,直到没有孩子节点时才开始搜索叶子节点,常见的前序遍历.中序遍历.后序遍历就是属于深度优先遍历. 2. 产生死锁的4个条件,

c++笔试题贪吃蛇问题

贪吃蛇 现在有一个N*M(N,M=100)的方形矩形,在这个矩形的每一个方格上都放有一个随机值,一条可爱的小蛇从矩形的 左上角开始出发,每次移动都只能移动一格,向右或向下,而每到达一格贪吃的小蛇都会吧该位置上的值吃个一干二净,直到到达右下角时停止.而贪吃的小蛇不怕撑死,它只想吃到最多,并输出路径. #include <iostream> #include<string> #include <cstring> #include<vector> #include

多线程关于腾讯笔试题

今天在头条上看到一道据说是腾讯的笔试题,闲来无事,准备验证一下! 题目如下: 有一个变量int a=0:两个线程同时进行+1操作,每个线程加100次,不加锁,最后a的值是()? 根据我的理解答案不唯一,最大是两百,最小是2吧.直接上代码: class MyThread implements Runnable { static volatile long i = 0; public void run() { for (int m = 0; m < 100; m++) { i++; } } }; p