1、以下程序的打印结果是()
- #include<iostream>
- using namespace std;
- void swap_int(int a , int b)
- {
- int temp = a;
- a = b;
- b = temp;
- }
- void swap_str(char* a , char* b)
- {
- char* temp = a;
- a = b;
- b = temp;
- }
- int main(void)
- {
- int a = 10;
- int b = 5;
- char* str_a = "hello world";
- char* str_b = "world hello";
- swap_int(a , b);
- swap_str(str_a , str_b);
- printf("%d %d %s %s\n", a , b , str_a , str_b);
- return 0;
- }
C、5 10 hello world world hello D、5 10 hello world world hello
这里二级指针的写法是这样的:
#include <stdio.h>
void swap_str(char **a, char **b)
{
char *temp = *a;
*a = *b;
*b = temp;
}
int main(void)
{
char *str_a = "hello world";
char *str_b = "world hello";
swap_str(&str_a, &str_b);
printf("%s %s\n",str_a, str_b);
return 0;
}
2、以下程序打印的两个字符分别是(A)
- typedef struct object object;
- struct object
- {
- char data[3];
- };
- int main(void)
- {
- object obj_array[3] = { {'a','b','c'},
- {'d','e','f'},
- {'g','h','i'} };
- object* cur = obj_array;
- printf("%c %c\n", *(char*)((char *)(cur)+2) , *(char*)(cur+2));
- return 0;
- }
A、c g B、b d C、g g D、g c
这题不难:看这篇帖子http://blog.csdn.net/zpxly/article/details/11632293的最后
3、C/C++语言:请问在64位平台机器下 sizeof(string_a) , sizeof(string_b)大小分别是(A)- char *string_a = (char *)malloc(100*sizeof(char));
- char string_b[100];
A、8 100 B、100 8 C、100 100 D、8 8
sizeof第一个是指针,所以X64下是8个字节,基本题目
4、假设二叉排序树的定义是:1、若它的左子树不为空,则左子树所有节点均小于它的根节点的值;2、若右子树不为空,则右子树所有节点的值均大于根节点的值;3、它的左右子树也分别为二叉排序树。下列哪种遍历之后得到一个递增有序数列(B)A、前序遍历 B、中序遍历 C、后序遍历 D、广度遍历
这个定义其实是二叉搜索树的定义,看这个帖子:http://blog.csdn.net/zpxly/article/details/11529541
5、往一个栈顺序push下列元素:ABCDE,其pop可能的顺序,下列不正确的是(C)A、BACDE B、ACDBE C、AEBCD D、AEDCB
基本题目:出栈入栈
6、1100|1010 , 1001^1001 , 1001&1100分别为(A)A、1110 0000 1000 B、1000 1001 1000
C、1110 1001 0101 D、1000 1001 1000
基本题目
7、二叉树是一种树形结构,每个节点至多有两颗子树,下列一定是二叉树的是(AC)A、红黑树 B、B树 C、AVL树 D、B+树
红黑树和AVL树是高级的数据结构,也是常考的数据结构,它们都是二叉搜索树的改进
8、int A[2][3] = {1,2,3,4,5,6}; , 则A[1][0]和*(*(A+1)+1)的值分别是(A)A、4 5 B、4 3 C、3 5 D、3 4
基本题目
9、序列16 14 10 8 7 9 3 2 4 1的说法下面哪一个正确(A)A、大顶堆 B、小顶堆 C、不是堆 D、二叉排序树
10、输入若已经是排好序的,下列排序算法最快的是(A)
A、插入排序 B、Shell排序 C、合并排序 D、快速排序
最慢的是快速排序,每次都不能平均划分区间
11、一种既有利于短作业又兼顾长期作业的调度方式是(D)A、先来先服务 B、均衡调度 C、最短作业优先 D、最高响应比优先
12、同一进程下的线程可以共享(B)A、stack B、data section C、register set D、thread ID
线程自己拥有的包括:线程ID,线程自己的堆栈,线程的返回码,线程优先级,信号屏蔽字,寄存器组的值(6个)
线程间共享的有:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件
描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
13、系统中的“颠簸”是由(B)引起的。A、内存容量不足 B、缺页率高 C、交换信息量大 D、缺页率反馈模型不正确
还记得虚拟内存调度的一些算法吗?FIFO,OPT,LRU
14、8瓶酒一瓶有毒,用人测试。每次测试结果8小时后才会得出,而你只有8个小时的时间。问最少需要(B)人测试?A、2 B、3 C、4 D、6
是3个人,如果你学过数的2进制编码,就容易说了:
8瓶酒的编码如下:
0: 000
1: 001
2: 010
3: 011
4: 100
5: 101
6: 110
7: 111
3个人分别喝3个位上为1的编码,所以:
第一个:1,3,5,7
第二个:2,3,6,7
第三个:4,5,6,7
把中毒的人的位填1的二进制数,就是毒酒的编号。
这个题目很有思想,刚开始还以为用二分法
15、下列关于网络编程错误的是(AB)A、TCP建立和关闭连接都只需要三次握手
B、UDP是可靠服务
C、主动关闭的一端会出现TIME_WAIT状态
D、服务端编程会调用listen(),客户端也可以调用bind()
基本题目,注意D中,客户端也可以调用bind
16、进程间通讯有哪几种形式(ABCD)A、Socket
B、Pipe
C、Shared memory
D、Signal
总结一下:有7中方式:管道(pipe) 命名管道(named pipe) 消息队列(message queue) 共享内存(shared memory) 信号量(semophore)
信号(signal) 套接字(socket) 推荐看《unp2》
17、TCP/UDP下面正确的是(AC)A、TCP provide connection-oriented,byte-stream service;
B、Both TCP and UDP provide reliability service;
C、TCP also provides flow control;
D、Both TCP and UDP provide retransmission mechanism;
我记得这好像是 tcp/ip1上面的原话,那就去看《tcp/ip1》推荐看英文版的,写的很好
18、分布式系统设计包括(ABCDE)A、容错,design for fault
B、多数据中心的数据一致性
C、数据/服务可靠性
D、可扩展性E、要满足ACID特性
分布式:目前还没有涉及这个领域
19、10个不同的球,放入3个不同的桶内,共有(C)种方法。 3^10A、1000 B、720 C、59049 D、360
简单的高中数学题
20、87的100次幂除以7的余数是多少(D)A、1 B、2 C、3 D、4
看了一个人给出的解法:87^100%7=3^100%7=9^50%7=2^50%7=32^10%7=4^10%7=16^5%7=2^5%7=32%7=4,算是比较正规的
二、简答题:1、
(1)请描述进程和线程的区别?
1.进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在
2. 线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。
3. 系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。
4.进程切换比线程切换开销大是因为进程切换时要切页表
(2)多线程程序有什么优点、缺点?(2)多进程程序有什么优点、缺点?与多线程相比,有何区别?
2、编程题:
写代码,反转一个单链表,分别以迭代和递归的形式来实现
- typedef struct node LinkNode;
- struct node
- {
- int data;
- LinkNode* next;
- };
LinkNode *reverse_link(LinkNode *head)
LinkNode *reverse_link_recursive(LinkNode *head)
- // 返回新链表头节点
- LinkNode *reverse_link(LinkNode *head)
- {
- if(head == NULL)
- return NULL;
- LinkNode *prev , *curr , *reverse_head , *temp;
- prev = NULL , curr = head;
- while(curr->next)
- {
- temp = curr->next;
- curr->next = prev;
- prev = curr;
- curr = temp;
- }
- curr->next = prev;
- reverse_head = curr;
- return reverse_head;
- }
- LinkNode *reverse_link_recursive(LinkNode *head)
- {
- if(head == NULL)
- return NULL;
- LinkNode *curr , *reverse_head , *temp;
- if(head->next == NULL) // 链表中只有一个节点,逆转后的头指针不变
- return head;
- else
- {
- curr = head;
- temp = head->next; // temp为(a2,...an)的头指针
- reverse_head = reverse_link_recursive(temp); // 逆转链表(a2,...an),并返回逆转后的头指针
- temp->next = curr; // 将a1链接在a2之后
- curr->next = NULL;
- }
- return reverse_head; // (a2,...an)逆转链表的头指针即为(a1,a2,...an)逆转链表的头指针
- }
如:1、-2、3、5、-4、6 连续序列3、5、-4、6的和最大。
如元素全为负数,则最大的和为0,即一个也没有选。
/*
array[] 输入数组
n 数组元素个数
返回最大序列和
*/
int find_max_sum(int array[] , int n)
- int find_max_sum(int array[] , int n)
- {
- int i , max , sum;
- sum = max = array[0];
- for(i = 1 ; i < n ; ++i)
- {
- if(sum < 0)
- sum = array[i];
- else
- sum += array[i];
- if(sum > max)
- max = sum;
- }
- if(max < 0)
- max = 0;
- return max;
- }
1、设计一个图片存储系统:假设有一个相册系统,每个用户不限制上传的图片数目,每张相片压缩后都在1M以内,需求如下:
(1)文件数量太大,采用传统的文件系统存储导致目录系统非常臃肿,访问速度变得缓慢;
(2)单机存储容量已经远远不能承载所有的文件;(3)上传之后,用户只有读取操作和删除操作,不支持修改,整个系统读写比例10:1