【面试题】面试题合集一

1.【阿里】“村长”带着4对父子参加“爸爸去哪儿”第三季第二站某村庄的拍摄。村里为了保护小孩不被拐走有个千年的规矩,那就是吃饭的时候小孩左右只能是其他小孩或者自己的父母。那么4对父子在圆桌上共有几种坐法。(旋转一下,每个人面的的方向变更后算是一种新的坐法)。

A 144  B 240  C 288  D 480  E 576  F 960

【推测-->不一定正确】


左图中,先选择两个父亲放置在父亲团边界,剩下两个父亲和村长可以随意组合排列,而南方的两孩子位置可换,然后父亲团可以与孩子团对调,坐法有4C2*3!*2*2=216;右图,父亲随机排列除以重复排列,乘以村长可加入位置,坐法有4!/2*2=24。

所以,共有240种坐法。

2.【阿里】12321能被写成几种两个质数相加的形式。

已知12321为一奇数,奇数=奇数+偶数,偶数只可能的指数为2,所以只需要判断12319是否为质数即可。

而12319=97*127非质数,所以,12321不能写成两质数相加形式。

3.【阿里】某团队有2/5的人会写Java程序,有3/4的人会写C++程序,这个团队里同时会写Java和C++的至少有()人 。

假设团队有n个人,同时会写Java和C++的至少有(2/5+3/4-1)*n=0.15n,n至少为4、5的最小公倍数,即20,所以至少有3人。

4.【腾讯】在如图6*8的矩阵中,从A到B一共有多少种走法,要求:不经过P点,每次移动只允许向上或向右。


思路:假设有m*n矩阵,从A到B的走法表示为T(m,n),将其分成子问题得出推导公式:


T(m,n)=T(m-1,n)+T(m-1,n-1)+...+T(m-1,1)

仔细观察可以得知T(m,n-1)=T(m-1,n-1)+...+T(m-1,1),

所以上式简化成T(m,n)=T(m-1,n)+T(m,n-1),并加入结束条件T(1,x)=1,T(x,1)=1,且T(m,n)=T(n,m)

所以,可以得出一个表:

m\n12345678
111111111
212345678
31361015212836
4141020355684120
515153570126210330
6162156126252462792
由于规定不能经过P点,那么将T(6,8)-f(A,P)*f(P,B)即可得出结果,即A到P点的走法乘以P到B点的走法为规定不允许的

所以有T(6,8)-T(4,4)*T(3,5)=792-20*15=492。
5.【腾讯】若一棵完全二叉树含有2*n-1个结点,叶子结点数为多少?

完全二叉树性质:当完全二叉树节点数为奇数时,度为0的节点数=度为2的节点数+1

所以叶子结点(度为0的节点)数为n。

6.【蜻蜓FM】若一棵二叉树叶子结点个数为m,那么度为2的结点数为多少?

 假设二叉树的结点数为n,共有n-1条树枝,n0为叶子结点数,n1为度为1的结点数,n2为度为2的结点数,n=n2+n1+n0,n-1条树枝,n-1=2*n2+n1,

两式相减得到n0=n2+1;所以n0=m,n2=m-1。

7.【蜻蜓FM】已知无序数组A[n],其中n是一个很大的正整数,但不超过整型数表达范围,数组元素的值范围是[0,n-1],请找出A中任意一个值重复的元素,若不存在则返回-1,要求空间复杂度O(1)。

思路:从题目中看,可以看到一个非常特别的条件,数组元素的值范围是[0,n-1],这个可以引起我们的注意。

int search(int *d, int n){
  int k;
  while(k<n){
    if(*(d+k)==k)
      k++;
    else{
      if(*(d+k)==*(d+*(d+k)))
        return *(d+k);
      else
        swap(d+k, d+*(d+k));
    }
  }
  return -1;
}

8.【蜻蜓FM】假设我们提供某种脚本语言MS,他只支持int数据类型但是不支持负数,并且它只支持如下运算:

A.清零:X=0;

B.变量赋值:X1=X2;

C.变量自增:X++;

D.嵌套循环:

Loop(X1)

    ......

    Loop(X2)

    ......

    End

End

请注意1.常量不能出现“0”以外的数字;2.该脚本不支持任何比较运算或if语句。

如下程序循环执行了两次(意思是循环开始后,循环次数已经确定,不受循环体内部赋值干扰)

X=0; X++; X++;

Loop(X)

    X=0;

End

1)请用该脚本实现功能X=X-1

思路:由于没法输入负数,所以只能通过循环自加进行减一。

Xtemp=0; Xans=0;

Loop(X)

    Xans=Xtemp;

    Xtemp++;

End

X=Xans;

2)如果已经实现1)请实现功能X1=X1-X2,若X1<X2,执行完后X1=0;

思路,利用1)的实现,封装为一个函数,名为func1(X),返回X-1的值,然后循环执行X2次。

Loop(X2)

    func1(X1);

End

3)如果已经实现2),请实现功能X3=X1/X2,若X1<X2,执行完后X3=0。不需要考虑输入参数X2=0的情况。

思路:以减法代替除法,得出商,比如6/3,6-3,3-3有两次,则商为2。(注意循环次数在循环开始后不能更改)

Xs=0;

X1++;

Loop(X1)

    func2(X1,X2);

    Xans=0;

//Xans+1;

    Loop(X1)

        func1(Xans);

        Xans++;

    End

    Loop(Xans)

        Xs++;

    End

End

X3=Xs;

9.【百度】在由N个正整数的集合S中,找出最大元素C,满足C=A+B,其中A,B都是集合S中的元素,并给出时间复杂度。

思路:先对无序集合进行排序,然后使用三个索引,一个是AB索引和比A+B大的元素最小索引。

int search_c(int *d, int n){
    int ak,bk,ck;
    int maxc;

    if(n<=1)
        return 0;
    ak=0; bk=1; ck=0;
    qsort(d, n);
    while(ck<n){
        if(*(d+ak)+*(d+bk)>*(d+ck))
            ck++;
        else if(*(d+ak)+*(d+bk)==*(d+ck))
            maxc=*(d+ck);
        else
            (bk>ak+1)?ak++:bk++;
    }
}

10.【百度】使用堆栈(Stack)来模拟队列(FIFO)功能,要求数据必须储存在堆栈内部。需要实现入队,出队,判空三个功能。

思路:使用双栈实现队列。

定义栈结构:

typedef struct{
    int data[MaxSize];
    int top;
}stack_typedef;
假设已经实现push和pop函数。

int is_empty(stack_typedef *s){
    if(s->top==0)
        return -1;
    else
        return 0;
}
int push(stack_typedef *s, int newdata){
    if(top==MaxSize)
        return -1;
    else
        return (*(s->data+top++)=newdata);
}
int pop(stack_typedef *s){
    if(is_empty(s)==-1)
        return INT_MIN;
    else
        return *(s->data+top--);
}
int enqueue(stack_typedef *s, int data){
    push(s, data);
}
int dequeue(stack_typedef *s){
    stack_typedef *news;
    int rtn;
    news = (stack_typedef*)malloc(sizeof(stack_typedef));
    news->top=0;
    while(is_empty(s))
        push(news, pop(s));
    rtn = pop(news);
    while(is_empty(news))
        push(s, pop(news));
    return rtn;
}








转载于:https://www.cnblogs.com/xhyzjiji/p/6159368.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.嵌入式实时操作系统的特点与常用的几种嵌入式操作系统。 实时性,可裁剪性。 ucos-Ⅱ RTLinux ARM-Linux KURT TimeSys Linux Mach 商业常见 VxWorks QNX pSOS Windows CE 2.掌握uC/OS-Ⅱ操作系统中的任务的存储结构与任务控制块主要成员变量的作用、任务的程序结构、任务的调度过程、任务状态的转换过程、任务的创建过程。任务级的切换与中断级的切换。 一.任务的存储结构P74 前一个任务控制块的Ptr 后一个任务控制块的Ptr 指向任务的Ptr 指向堆栈的Ptr 任务的优先级别 ............................ 任务的代码: void mytask(void * ) {......... For( ; ; ) {......} } 任务的堆栈: ....................... 系统在运行一个任务是,先按优先级找到任务控制块,在任务堆栈中找到任务代码的指针。 任务控制块是系统管理任务的依据。 任务控制块-------保存任务的属性 任务的代码-------任务的执行部分 任务的堆栈-------保存任务的工作环境 二.任务控制块主要成员变量的作用P78 不同任务 TCB成员变量个数不是固定的。 其中 OSTCBStat 用来存放任务当前状态。 其中 OSTCBDly 用来存放任务等待时限(节拍数)。 其中 OSTCBPrio 用来存放任务的优先级。 所有任务控制块分为2条链表:空闲任务块链表和任务块链表。 空闲任务块是uC/OS-Ⅱ的全局数据结构 OSInit()创建空闲任务控制块链表的步骤:1先在RAM中建立一个OS_TCB结构类型的OSTCBTb1[]使数组每个元素都是一个任务控制块,然后利用OS_TCB结构中的OSTCBTNext和OSTCBPrev连起来构成一个链表。 为了加快对任务控制块的访问速度:除了任务控制块链表创建成双向链表外在uC/OS-Ⅱ的uCOS-Ⅱ.H中还定义了一个OS_TCB*类型的数组OSTCBTb1[]专门用来存放指向各任务控制块的指针。 删除一个任务的实质:把任务的控制块从任务控制块链表中删除,并把它归还给任务控制块链表。但是任务的代码还在内存中没被删除。 任务的程序结构 任务的调度过程 在就绪任务表中寻找优先级最高的就绪任务置为运行态,然后中止当前正在运行的任务,从而运行刚刚那个置为运行态的任务 若 OSLockNesting当前的值不为0则 禁止调度 任务状态的转换过程 任务的创建过程 先检测任务的优先级是否合法 然后检测该优先级是否被占用 然后保留该优先级 然后初始化任务堆栈 然后获得任务控制块并初始化 然后任务计数器+1 最后调度 否则放弃任务 任务级的切换与中断级的切换 OSIntCtxSw() -- 中断级任务切换函数与OSCtxSw() -- 任务级切换函数的区别: OSIntCtxSw()与OSCtxSw()的后半部分相同,而OSIntCtxSw()缺少的断点保护,则在中断子程序中完成。但是两者都完成两任务的切换: OSCtxSw() 完成两个不同任务间的切换; OSIntCtxSw()则是在一定条件下,在中断结束后,原被中断的程序与更高优先级的任务之间的切换。 掌握五种任务的通信与同步的方法。对应的事件控制块与信号量集标志组的结构。并比较这五种任务的通信与同步的方法在请求、发送过程中的各自特点。 C/OS-Ⅱ操作系统初始化所须完成的的五件事:初始化几个重要的全局变量、数组OSTCBPrioTbl[ ]、就绪表、五个链表(空任务控制块、空事件控制块、空队列控制块、空信号量集标志组、空内存控制块)、创建空闲任务。或有条件创建统计任务。 中断及中断服务程序。定时中断服务及时钟节拍服务函数OSTimTick()的作用 CPU相应中断的条件:1至少有一个中断源向CPU 发出信号 2系统允许信号且未对此信号屏蔽。 钟节拍服务函数OSTimTick()的作用:1把用来记录时间进程的计数器OSTime+1 2遍历任务控制块链表中所有任务控制块,吧各个任务控制块中用来存放任务延时的OSTCBDly-1,并使该项为0,同时又不是被挂起的任务进入就绪状态。 6.掌握创建、请求与发送一个信号量与消息邮箱的程序流程。 7.熟练应用信号量与消息邮箱实现任务的通信与同步的程序设计。一个应用程序的基本框架。 8.了解C/OS-Ⅱ移植的一般原则。 C/OS-Ⅱ移植的条件:1在程序中可以开关中断2处理器支持中断并能产生定时中断3处理器支持中断且容纳一定数据的硬件堆栈4处理器有将堆栈指针和其他CPU存储器存储读取到堆栈的指令。 9.了解一个完整的基于C/OS-Ⅱ内核的操作系统的组成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值