2012.9.15 搜狐笔试

来源:http://blog.csdn.net/mishifangxiangdefeng/article/details/7982883

 

一、不定项选择题

1.C/C++语言:以下打印结果为()。

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void swap_int(int a, int b)  
  5. {  
  6.     int temp = a;  
  7.     a = b;  
  8.     b = temp;  
  9. }  
  10. void swap_str(char *a, char *b)  
  11. {  
  12.     char *temp = a;  
  13.     a = b;  
  14.     b = temp;  
  15. }  
  16.   
  17. int main()  
  18. {  
  19.     int a = 10;  
  20.     int b = 5;  
  21.     char *str_a = "hello world";  
  22.     char *str_b = "world hello";  
  23.     swap_int(a, b);  
  24.     swap_str(str_a, str_b);  
  25.     printf("%d, %d, %s, %s", a, b, str_a, str_b);  
  26.     return 0;  
  27. }  

A. 10, 5, hello world, world hello

B. 10, 5, world hello, hello world

C. 5, 10, hello world, world hello

D. 5, 10, world hello, hello world

答:A。都是按值传递,不改变原值


2. C/C++语言:请问打印的两个字符分别是()。

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. typedef struct object object;  
  5. struct object  
  6. {  
  7.     char data[3];  
  8. };  
  9.   
  10. object obj_array[3] = {{'a''b''c'},  
  11.                         {'d''e''f'},  
  12.                         {'g''h''i'},  
  13.                         };  
  14.   
  15. int main()  
  16. {  
  17.     object *cur = obj_array;  
  18.     printf("%c, %c", *(char*)((char*)(cur)+2), *(char*)(cur+2));  
  19.     return 0;  
  20. }  

A.c, g

B. b, d

C. g, g

D. g, c

答:A

cur中存储的是'a‘的地址,当cur是object指针时,cur+1后cur存储是数组下一个元素的首地址,即'd'的地址。当cur是char指针时,cur+1是'a'的下一个字符的地址,即'b'的地址


3. C/C++语言:请问在64位平台机器下,以下程序的输出结果()

  1. char *string_a = (char*)malloc(100*sizeof(char));  
  2. char string_b[100];  
  3. printf("%d, %d",sizeof(string_a), sizeof(string_b));  

A. 8, 100

B. 100, 8

C. 100, 100

D. 8, 8

答:A

string_a是一个指针,不管它指向的空间有多大,它本身的空间 是固定的。在64位平台机器下,一个指针的大小是8。



答:B

要是得到的序列为递增,应先访问左子树,再访问根结点,最后访问右子树,根据定义知为中序遍历


5. 往一个栈顺序push下列元素:ABCDE,其pop可能的顺序,下列不正确的是()

A. BACDE

B. ACDBE

C. AEBCD

D. AEDCB

答:C。


6. 1100|1010, 1001^1001, 1001&1100分别为()

A. 1110, 0000, 1000

B. 1000, 1001, 1000

C. 1110, 1001, 0101

D. 1000, 1001, 1000

答:A

1 | 1 = 1, 1 | 0 = 1, 0 | 0 = 0

1 ^ 1 = 0, 1 ^ 0 = 1, 0 ^ 0 = 0

1 & 1 = 1, 1 & 0 = 0, 0 & 0 = 0


7.二叉树是一种树形结构,每个节点至多有两颗子树,下列一定是二叉树的是()

A. 红黑树

B. B树

C. AVL树

D. B+树

答:AC


8.int A[2][3] = {1, 2, 3, 4, 5, 6}, A[1][0]和*(*(A+1)+1)的值分别是()。

A. 4, 5

B. 4, 3

C.3, 5

D.3, 4

答:A

数组是A[2][3] = {{1, 2, 3}, {4, 5, 6}},数组下标从0开始计数。前者是第1行第0列,后者是第1行第1列


9.序列16, 14, 10, 8, 7, 9, 3, 2, 4, 1的说法下面哪一个正确()

A. 是大顶堆

B. 是小顶堆

C. 不是堆

D. 是二叉排序树

答:A


10. 输入若已经是排好序的,下列排序算法最快的是()

A. 插入排序

B. Shell排序

C. 合并排序

D. 快速排序

答:A

插入排序一遍扫描即可

Shell排序虽不需要交换数据,但也要进行几次插入排序

合并排序虽不需要交换数据,但也要进行lgn次合并

快速排序在数列有序的情况下效率是最低的


11.一种既有利于短作业又兼顾长期作业的调度方法是()。

A. 先来先服务

B. 均衡调度

C. 最短作业优先

D. 最高响应比优先

答:B


12.同一进程下的线程可以共享()

A. stack

B. data section

C. register set

D. thread ID

答:B

A是栈区。同一个进程的线程共享堆区,但是各自维护自己的栈区

B是数据区。

C是寄存器

D线程ID。同一进程的线程共享一进程ID,各自拥有自己的线程ID

参考http://blog.csdn.net/yang201240/article/details/7243991


13.系统中的“颠簸”是由()引起的。

A. 内存容量不足

B. 缺页率高

C.交换信息量大

D. 缺页率反馈模型不正确

答:D

“颠簸”是《计算机操作系统》中的“抖动”,A和B会造成抖动,但不是主要原因。主要原因是由于每个进程的页面数没有很好地计算,导致某些页面反复地进出。


14.8瓶酒一瓶有毒,用人测试。每次测试结果8小时后才会得到,而你只有8小时的时间,最少需要()人测试

A. 2

B. 3

D. 4

D. 6

答:B。类似不带差错控制的海明码。淘宝出过这种题。



答:ABD

TCP的关闭连接是四次握手

UDP提供的是面向无连接的不可靠服务

C参考http://blog.csdn.net/zhangjay/article/details/6403076

客户端不可以调用bind()


16. 进程间的通讯有哪几种形式()

A. Socket

B. Pipe

C. Shared memory

D. Signal

答:ABCD

参考4-16笔试



答:AC


答:ABCDE


19.10个不同的球,放入3个不同的桶内,共有()种方法

A. 1000

B. 720

C. 59049

D. 360

答:C

3^10


20.87的100次幂除以7的余数是多少()

A. 1

B. 2

C. 3

D. 4

答:D

由公式(a*b)%c == (a%c)*(b%c)可知(87^100)%7=(87%7)^100=(3^100)%7

对于任意n(n>=0),(3^n)%7只能6种可能,依次为1,3,2,6,4,5……


二、简答题

1. (1)请描述进程和线程的区别?
(2)多线程程序有什么优点,缺点?
(3)多进程程序有什么优点,缺点?与多线程相比,有何区别。

2.写代码:反转一个单链表,分别以迭代和递归形式实现
  1. typedef struct node LinkNode;  
  2. struct node  
  3. {  
  4.     int data;  
  5.     LinkNode *Next;  
  6. };  
  7. //@ret 返回新链表头节点  
  8. LinkNode *reverse_link(LinkNode *head);  
  9. LinkNode *reverse_link_recursive(LinkNode *head);  

答:

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. typedef struct node LinkNode;  
  5. struct node  
  6. {  
  7.     int data;  
  8.     LinkNode *Next;  
  9. };  
  10. //@ret 返回新链表头节点  
  11. LinkNode *reverse_link(LinkNode *head);  
  12. LinkNode *reverse_link_recursive(LinkNode *head);  
  13. //非递归方法  
  14. LinkNode *reverse_link(LinkNode *head)  
  15. {  
  16.     LinkNode *p = head;  
  17.     while(p->Next != NULL)  
  18.         p = p->Next;  
  19.     LinkNode *ret = p;  
  20.     LinkNode *q = head;  
  21.     while(1)  
  22.     {  
  23.         while(q->Next != p)  
  24.             q = q->Next;  
  25.         p->Next = q;  
  26.         p = q;  
  27.         if(q == head)  
  28.         {  
  29.             q->Next = NULL;  
  30.             break;  
  31.         }  
  32.         q = head;  
  33.     }  
  34.     return ret;  
  35. }  
  36. //递归方法  
  37. LinkNode *reverse_link_recursive(LinkNode *head)  
  38. {  
  39.     if(head->Next == NULL)  
  40.         return head;  
  41.     LinkNode *ret = reverse_link_recursive(head->Next);  
  42.     head->Next->Next = head;  
  43.     head->Next = NULL;  
  44.     return ret;  
  45. }  
  46. //输出结果,用于测试  
  47. void Print(LinkNode *head)  
  48. {  
  49.     LinkNode *p = head;  
  50.     while(p)  
  51.     {  
  52.         cout<<p->data<<' ';  
  53.         p = p->Next;  
  54.     }  
  55.     cout<<endl;  
  56. }  
  57. //不是题目要求,用于测试  
  58. int main()  
  59. {  
  60.     int i;  
  61.     LinkNode *p = NULL;  
  62.     for(i = 0; i < 10; i++)  
  63.     {  
  64.         LinkNode *q = new LinkNode;  
  65.         q->data = i;  
  66.         q->Next = p;  
  67.         p = q;  
  68.     }  
  69.     Print(p);  
  70.     p = reverse_link(p);  
  71.     Print(p);  
  72.     p = reverse_link_recursive(p);  
  73.     Print(p);  
  74.     return 0;  
  75. }  


答:最大和子序列,HDOJ1003

http://acm.hdu.edu.cn/showproblem.php?pid=1003

  1. #include <iostream>  
  2. using namespace std;  
  3. int main()  
  4. {  
  5.     int n,m,i,j,num,start,end,start1;  
  6.     long max,temp;  
  7.     while(cin>>n)  
  8.     {  
  9.         for(j=1;j<=n;j++)  
  10.         {  
  11.             cin>>m;  
  12.             cin>>num;  
  13.             max=temp=num;  
  14.             start=start1=end=1;  
  15.             for(i=2;i<=m;i++)  
  16.             {  
  17.                 cin>>num;  
  18.                 if(temp>=0) {temp=num+temp;}  
  19.                 else  
  20.                 {  
  21.                     temp=num;  
  22.                     start1=i;  
  23.                 }  
  24.                 if(temp>max)  
  25.                 {  
  26.                     max=temp;  
  27.                     start=start1;  
  28.                     end=i;  
  29.                 }  
  30.             }  
  31.             cout<<"Case "<<j<<':'<<endl;  
  32.             cout<<max<<' '<<start<<' '<<end<<endl;  
  33.             if(j!=n) cout<<endl;  
  34.         }  
  35.     }  
  36.     return 0;  
  37. }  



三、设计题


微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

原文地址:https://www.cnblogs.com/heyonggang/p/2986885.html