程序员面试高频算法题

0. 请计算x的二进制表示中1的个数;计算x按比特左右反转的数;计算x使得当a=0时x=y,否则x=z;计算x的平方根……但是都不许用if、while、do-while、?:表达式,也不许用&&和||这两个运算符,不许调用子函数。 
  
应用:一些计算密集型的算法对分支很敏感,分支预测失败,就会浪费很多时间。if/while/do-while/?:以及短路运算符一般都是用控制流实现的。 
  
提问开始: 
  
1. 有一个数组,除了某一个元素出现了1次以外,其余每个元素都出现了两次。请找出这个元素。 
  
2. 有这么一个链表:struct node { struct node *next; struct node *any; }; 这是一个单链表,next指向下一个元素,最后一个的next指向NULL。每个元素都有一个any指针,指向链表中的任意一个元素(但不是当前节点)。要求:复制这个链表。可以破坏这个链表,也没有其他线程在读写这个链表。 
  
3. 给定一个数组,有n个元素,请找出最小的k个元素,不需要按顺序输出。已知k很小。在k小到一定程度的时候,有比大顶堆更快的方法。 
  
我猜:很多地方会找“前10名”、“前100名”这样的东西,数据量太大以至于O(n*logk)都嫌慢。 
  
4. 已知int i=42, j=3;。求j=i++ + j--;之后j的值。 
  
5. 现有1000瓶药水和足够多的瓶子和小老鼠。其中一瓶药水有毒,其余无毒。允许混合药水,混合的药水中,只要含有一点有毒药水,给小老鼠吃,小老鼠就会死。请问最少需要多少只小老鼠?(每只小老鼠只许喂一次药水)。设计实验方案。 
  
我猜:应该可以找出一堆patch中哪个引入了bug。但是这会比git的bisect更快吗。 
  
6. 如何检测单链表有没有环?如何找到第一个在环里的元素? 
  
7. 有1000000头奶排着队,已知每只奶牛的身高,每只奶牛能看到自己前面比自己矮的奶牛,直到被一只比自己高的奶牛挡住。求出每只奶牛分别能看到几只前面的奶牛。    

我猜:看到统计数据(比如CPI指数),可以求出“这个数字是自?年?月?日以来的最大值”。

8. 聚集在玛利亚的庭院里的少女们,今天也带着天使般无垢的笑容穿越与身同高的……已知n个少女,每个少女都暗恋另一个少女(不是自己),请建立一个最大的“恋爱同盟”,要求成员尽可能多,且成员之间不许有两个人相爱。 

本题可以用最大团来解决。不认识的人之间连线,认识的人不连线。找出一个最大团,即是“恋爱同盟”。

或者,认识的人之间连线,不认识的不连线。每次从这个图中找到一个度数最高的结点,将这个结点从图中删除。不断重复上述步骤,直到图中所有的点的度数都是零。

我猜:同性恋婚恋网组织线下活动的算法。(被pia飞)大家想一想应用是什么。 
  

9. 已知一个数组有n+1个元素,所有的元素都是[0,n-1]之间的整数。只有一个元素出现了两次,其余的出现了1次。找出这个出现两次的数。 

int a[11] = {....}    
int result = a[0] ^ a[1] ^ a[2] ^ a[3] ^ a[4] ^ a[5] ^ a[6] ^ a[7] ^ a[8] ^ a[9] ^ a[10] ^ 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8 ^ 9;


你可能感兴趣的:(程序员面试高频算法题)