热门话题白皮书HR资料
牛客面经|创意面试问题集锦
2024.05.24

作者:天猫游泳池
来源:牛客网

1.1        在成对存在的数组中(即数组中的每个数必然存在另一个与其值相等的一个数),被程序员误插入了一个数(即该数在这个数组中唯一),如何找出这个数?  

 

答案:将所有数化为二进制,做异或。

 

   1.2        在成对存在的数组中(即数组中的每个数必然存在另一个与其值相等的一个数),被程序员误插入了两个数(即这两个数在这个数组中都是唯一),如何找出这两个数?  

 

答案:异或所有数,所得结果相当于混入的这两个数的异或,取其不为0的某一位,按照这一位将数组元素分成两组(一组为0,一组为1),两组组内异或,分别得到这两个数。

 

   2.1        给定一个数组a[],一次遍历在其中找出最大(最小)的元素。  

 

答案:冒泡排序。

      

   2.2        给定一个数组a[],找出其中某两个数的和等于给定的一个数M。  

      

答案:首先快排(从小到大),然后头尾两个指针,若头尾指向的数之和大于M,尾指针减减,否则头指针加加。

 

   2.3        给定一个数组a[],在其中找k个数(k>=2),使得其和等于给定的一个数M,没有返回false。  

 

答案:动态规划-01背包问题。

 

   3.1        四人过桥问题:速度设为v1,v2,v3,v4,满足v1>v2>v3>v4单独过河时间满足:t1<      t2 < t3 < t4,此时正在下雨,四人只有一把伞,于是两人共有一把伞过河,过桥速度以最慢的为主,过河后需要其中一个送伞回去,问如何安排过河时间最短?  

 

答案:方案一:正常思维会认为v1速度最快,让他每次回头送伞最合适,于是v1分别与其他人过河再回头送伞,总时间:t2+t3+t4+2*t1。

方案二:考虑到v1>v2>>>v3>v4(即v1、v2远远大于v3、v4),可以让v1、v2先过河,v1回头送伞,v3、v4一起过河,v2回头送伞,然后v1、v2再过河,

总时间:t2+t1+t4+t2+t2。

综合考虑,本题回答动态规划为最佳答案。

 

 

 

   4.1        存在函数A()可以产生0~9 的随机数,且等概率的产生每个随机数,现在需要编写一个函数B(),使得产生数字1、2、3的概率为0.2,数字4的概率为0.4。  

 

答案:public int B( ){

           Switch(A()){

              Case 0,6,7,8,9: B( );

              Case 1,2,3: Print(1    or 2 or 3);break;

              Case 4,5:Print(4);break;

           }

     }




5.用计算机知识(语言)描述一个非计算机场景。  

 

答案:刚听到这个面试题,我是懵逼的,经过一番沟通后我的描述如下(答案不唯一,欢迎各位补充):我举的例子是老师上课,老师是进程,教室是资源,教室的门是临界区,如果老师上课,那么首先将门置为“请勿打扰”,防止其他老师过来申请,课程结束后将门置为“空闲”。学生是子进程或者线程,因为上课的书,笔以及做的东西都是由老师发或者指导,类似于进程拥有资源而线程不占用资源,(这个时候面试官问了一句:那如果老师死了,学生跟着一起死呗?说实话,我又懵逼了,我说人都有寿命嘛,老师比较大,死完学生再死,后来回去的路上觉得真心对不住教我操作系统的老师,想了想更好的回答是:如果课程结束,老师和学生是同时下课的,父进程结束的时候子进程或者线程也是同时结束的),然后又问我并发和并行呢?我说并发是所有学生同时做作业,所有人都在同一时间段做,并行是A组同学画素描,画完后交给B组上色,最后相对于整节课而言,一幅画是完成了。再然后我答得就是稀里糊涂的了~~

 

6.二叉树按行打印  

 

答案:这是一道老题了,首先注意是按行打印,判断何时需要换行,实现的时候需要一个队结构,我是用链表实现的,其次改造node结点,在原基础上加一个line标记,表示该结点是第几行的,具体实现:初始化:树根入队,定义变量current(当前行)为1,打印树根,然后判断树根的左孩子和有孩子是否为空,依次入队,递归调用。

伪代码:  current=1;front=T; rear=front.next;

           Public A( root) {

              If(front.next==null){return ;}//树根为空,退出

              If(root.flag==(current+1)){ 换行}//当前结点的标志位等于当前行数加一,该换行了;

              Print(root.data);  //打印值

              If(root.left!=null){ //加入左孩子

                 rear.flag=Root.flag+1; //标记结点行数

                 rear=Root.left;

                 Rear=Rear.next;

                }

              If(root.right!=null){ //加入右孩子

                 rear.flag=Root.flag+1; //标记结点行数

                 rear=Root.right;

                 Rear=Rear.next;

                }

              A(front);  //递归调用

           }

 

 

7.给你四个坐标(x,y)判断是否为矩形?  

 

答案:取一个点,与其他三个点求距离,看是否满足勾股定理,然后计算余弦值,只要存在负数,就说明有钝角,return FALSE,否则为真。

 

8.给定一个数组,从中取三个值,将数组分成四个部分(不包含这三个值),使得四个部分每个部分之和相等。如以下数组:1213151,取出的三个值分别为:2,3,5。  

 

答案:暴力法:设置三个指针,i1、i2、i3,四个和值:sum1、sum2、sum3、sum4,分别表示0~i1(不含i1),0~i2(不含i1,i2),0~i3(不含i1,i2,i3),数组总和(不含i1,i2,i3),三层循环,最终找出满足一下关系式:4sum1=2sum2=(4/3)    * sum3=sum4。

 

点击阅读原文,查看更多面试经验!