小米公司2013校园招聘笔试题(研发)+答案

一,填空题

1. 两个人一个速度为a,一个速度为b,相向而行,在距离为s的时候,A放出鸽子,速度为c,鸽子飞到B后,会返回A,遇到A后再返回B。在这期间鸽子飞行的路程


2. (he)的平方 = she。 h,e,s 各代表什么


3. 运算 93 & -8


4. 将无序数组构建成最大堆,最差的时候,复杂度是


5. int *p = &n;
     *p 的值是
     A. p 的值 B. p的地址 C. n的值 D. n的地址
6. 一个完全二叉树有770节点,那么叶子个数为
7. 有一个数组a[1...100, 1...65] 有100行 65列。
    按行优先,如果数组基地址是 10000,每个元素2各存储单元,问a[56, 22]的地址是


8.  写出一下程序结果

  1. #include <iostream> 
  2. #include <string> 
  3. using namespace std; 

  4. class B 


  5. public: 
  6. B() 

  7. cout<<"B is constructing"<<endl; 
  8. s = "B"; 

  9. void f(){ 
  10. cout<<s; 

  11. private: 
  12. string s; 
  13. }; 

  14. class D:public B{ 
  15. public: 
  16. D():B(){ 
  17. cout<<"D is constructing"<<endl; 
  18. s = "D"; 

  19. void f(){ 
  20. cout<<s; 

  21. private: 
  22. string s; 
  23. }; 

  24. int main(){ 

  25. B* b = new D(); 
  26. b->f(); 
  27. ((D*)b)->f(); 
  28. delete b; 
  29. }
复制代码
二, 编程题1. 数组乘积
输入: 一个长度为n的整数数组input
输出: 一个长度为n的数组result,满足result = input数组中,除了input 之外的所有数的乘积,不用考虑溢出
例如 input
{2, 3, 4, 5}
output:
{60, 40, 30, 24}


2, 异形数
长度为n的数组里面,除了3个数字,其他都出现2次,写出程序找出任意一个数。
例如 
1 3 7 9 5 5 9 4 3 6 1 7
输出
4/5/6 




3. 朋友圈
假如已知有n个人和m对好友关系,如果两个人是直接或者间接有好友关系,则认为他们属于同一个朋友圈。写程序判断里面有多少朋友圈。
例如 
n = 5, m = 3  r = {(1,2), (2, 3), (4, 5)}  1 2 3 是一个朋友圈, 4 5 是一个朋友圈。
所以输出是2. 

来源:http://blog.csdn.net/hopeztm/article/details/8062562

华丽的答案分割线
————————————————————————————————————————————
答案整理:
1.这题目叙述有点绕,其实表达的意思是a,b相遇时, 鸽子飞了多远。所以是c*s/(a+b)
2.这题不难,就算是枚举也能做出来的。
这里给出一段代码计算:
  1. int print()
  2. {
  3.         int i,j;
  4.         int w=0;
  5.         int t=0;
  6.         for(i=1;i<10;i++)
  7.                 for(j=0;j<10;j++)
  8.                 {
  9.                         w=i*10+j;
  10.                         t=w*w/100;
  11.                         if(w*w==t*100+w)
  12.                                 printf("%d-%d-%d\n",i,j,t);
  13.                 }

  14.         return 0;        

  15. }
  16. void main()
  17. {
  18.    print();
  19. }
复制代码
最后的结果是:
25*25=625,76*76=5776,而76显然不符合要求。
所以答案是25

3.这题考察的是C语言里面的 与运算。还有计算机的原码、补码知识(忘记了可以参考以下的资料,如果看完了还表示不会的,建议你面壁去,)。具体参考:
c++中 &和&&的区别是什么?
http://www.itmian4.com/forum.php?mod=viewthread&tid=2115
原码、反码、补码和移码其实很简单
http://www.itmian4.com/forum.php?mod=viewthread&tid=2113&fromuid=1

93=01011101,-8=11111000(补码)
根据与运算规则可知93&-8=01011000=88

4.这题考查的是最大堆以及堆排序的问题,建议参考
最大堆/最小堆
http://www.itmian4.com/forum.php?mod=viewthread&tid=2116&fromuid=1
图解堆排序Heap Sort算法
http://www.itmian4.com/forum.php?mod=viewthread&tid=2117&fromuid=1
堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。
堆排序的最坏时间复杂度O(nlogn)。堆序的平均性能较接近于最坏性能。
由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。
堆排序是就地排序,辅助空间为O(1),
它是不稳定的排序方法。

5.很基础的题目,指针P指向n的地址,所以*P就是n的值,选C。

6.

完全二叉树总结点数为N,若N为奇数,则叶子结点数为(N+1)/2; 若N为偶数,则叶子结点数为N/2。

   完全二叉树:最后一层不一定满,但缺失的一定是右侧的 

   满二叉树 : 最后一层一定是满的


7.地址为:10000+(55*65+21)*2=17912

8.
B is constructing
D is constructing
BD

二编程题:
1.数组乘积
  1. int *cal(int* input , int n)
  2. {
  3.         int i ;
  4.         int *result = new int[n];
  5.         int sum=1;
  6.         for(i = 0 ; i < n ; ++i)
  7.                 sum = sum*input[i];
  8.         
  9.         for(i = 0; i < n ; ++i)
  10.         {
  11.                 result[i] =sum/input[i];
  12.                 
  13.         }
  14.         return result;
  15. }

  16. int print(int *result,int n)
  17. {
  18.         for(int i=0;i<n;i++)
  19.         {
  20.                 printf("%d ",result[i]);
  21.         }
  22.         printf("\n");
  23.         return 0;

  24. }

  25. int main(void)
  26. {
  27.         int a[]={2,3,4,5};
  28.         int* b={0};
  29.         b=cal(a,4);
  30.         print(b,4);
  31.         return 0;

  32. }
复制代码
2.异形数
  1. // lowbit表示的是某个数从右往左扫描第一次出现1的位置
  2. int lowbit(int x)
  3. {
  4.         return x&~(x-1);
  5. }

  6. void find(int* a , int n)
  7. {
  8.         int i , xors;
  9.         xors = 0;
  10.         for(i = 0 ; i < n ; ++i)
  11.                 xors ^= a[i];
  12.         // 三个数两两的异或后lowbit有两个相同,一个不同,可以分为两组
  13.         int fips = 0;
  14.         for(i = 0 ; i < n ; ++i)
  15.                 fips ^= lowbit(xors ^ a[i]);
  16.         // 表示的是:flips=lowbit(a^b)^lowbit(a^c)^lowbit(b^c) 
  17.         int b;    // 假设三个只出现一次的其中一个数为b
  18.         b = 0;
  19.         for(i = 0 ; i < n ; ++i)
  20.         {
  21.                 if(lowbit(xors ^ a[i]) == fips)
  22.                         b ^= a[i];
  23.         }
  24.         // 成功找到三个数中一个数
  25.         cout<<b<<endl;
  26. }
复制代码
3.朋友圈:
  1. // 简单的并查集应用
  2. int set[10001];

  3. inline int find(int x)           //带路径优化的并查集查找算法
  4. {
  5.     int i , j , r;
  6.     r = x;
  7.     while(set[r] != r) 
  8.         r = set[r];
  9.     i = x;
  10.     while(i != r) 
  11.     {
  12.         j = set[i];
  13.         set[i] = r;
  14.         i = j;
  15.     }
  16.     return r;
  17. }
  18. inline void merge(int x , int y)     //优化的并查集归并算法
  19. {
  20.     int t = find(x);
  21.     int h = find(y);
  22.     if(t < h)
  23.         set[h] = t;
  24.     else
  25.         set[t] = h;
  26. }

  27. int friends(int n , int m , int* r[])
  28. {
  29.         int i , count;
  30.         for(i = 1 ; i <= n ; ++i)    //初始化并查集,各点为孤立点,分支数为n 
  31.                 set[i] = i;
  32.         for(i = 0 ; i < m ; ++i)
  33.                 merge(r[i][0] , r[i][1]);
  34.         count = 0;
  35.         for(i = 1 ; i <= n ; ++i)
  36.         {
  37.                 if(set[i] == i)
  38.                         ++count;
  39.         }
  40.         return count;
  41. }
复制代码

最后两题答案来自:http://blog.csdn.net/hackbuteer1/article/details/8484974

转载注明:IT面试http://www.itmian4.com/

你可能感兴趣的:(小米,笔试)