1、下面哪些选项能编译通过()?
int i;
char a[10];
string f();
string g(string &str);
A. if(!!i){f();}
B. g(f());
C. a=a+1;
D. g("abc");
解析:
A是肯定对的,因为他有一个默认值。
B选项是错误的。因为f() 返回的是一个临时量,然后传给 g 函数,而 g 的参数不是const 引用,是不能引用临时量的。
C选项是错误的。因为a 是一个地址常量,不可能再被赋值。
D选项是错误的。因为”abc” 的类型可是 const char* 呢,是个常量指针(可以用来初始化 string)。
2、下面哪些说法正确?()
A. 数组和链表都可以随机访问
B. 数组的插入和删除可以 O(1)
C. 哈希表没有办法做范围检查
D. 以上说法都不正确
解析:
A选项是错误的,因为数组可以直接通过下标得到存储的值 因此支持随机;而访问链表是链式存储结构时无法支持随机访问,要访问一个指定位置的元素必须从头开始做指针移动
B选项是正确的,因为数组的插入如果位置在最后面的话可以为O(1),删除的时候,直接通过下标指定要删除哪个即可,所以也可以为O(1)
C选项是错误的,因为哈希表支持直接通过关键码得到值 其实数组就是一种哈希表 下标就是关键码 通过下标直接得到值 因此哈希表肯定需要做范围检查也有办法做范围检查的
D选项是错误的,这个不用解释啦
3、基于比较的排序的时间复杂度下限是多少?()
A. O(n)
B. O(n^2)
C. O(nlogn)
D. O(1)
解析:其实大家记住这个结论就好,在当前计算机科学界对于基于比较的排序最快只是O(n*logn),例如快速排序,堆排序,归并排序
4、有两个线程,最初 n=0,一个线程执行 n++; n++; 另一个执行 n+=2; 问,最后可能的 n 值?()
A. 1
B. 2
C. 3
D. 4
解析:【BCD】大家要知道 C语言中的 ++ 和 += 并不是原子操作,而是通过多条微程序组成的,因此 ++ 和 += 在执行过程中可能被中断的
第一种可能情况:现在假设两个线程没有并行顺序执行的那么结果显然是 4。
第二种可能情况:再假设现在第一个n++ 已经执行完了 但是结果还没有写回内存 这个时候 n+=2 已经全部执行完 2 写进了内存 结束 然后回到n++的写回操作 这个时候内存就从2被改回1了,后面再来一次n++ 结果就为2。
第三种可能情况: 第n+=2 先读取n的值到寄存器 即0入寄存器 这个时候被中断 第一个n++开始执行 并直到结束 内存被改成了1 ,然后 n+=2 继续执行 结束后内存变为2 第二个n++再执行 结果就是3了
我个人看了网上的这个解析后也觉得,肯定不可能为1了。
5、死锁
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之
6、在32位little endian机器上运行该程序,得到结果是什么?
#include <stdio.h>
int main()
{
long long a = 1, b = 2, c = 3;
printf("%d %d %d \n", a, b, c);
return 0;
}
解析:【1 0 2】因为long long 是8个字节的,%d是4个字节的,溢出覆盖了后面,然后又是小端规则的。
【传入参数,由右往左,栈空间内存从高往低,little endian, 栈空间如下:
内存高位->
00000000 00000011
00000000 00000010
00000000 00000001
<-内存低位
7、高内聚和低耦合,下面哪个耦合度最高?
A. 通过函数参数传递…
B. 一个函数修改另外一个函数中的数据;
C. 通过全局变量…
D. 通过指示器…
解析:【C】
内聚:就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。) 对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合.
8、TCP协议栈的定时器有延时定时器,重传定时器,坚持定时器,保活定时器
附:TCP/IP网络层次结构 http://blog.csdn.net/huangxy10/article/details/8105967
9、给定3个int类型的正整数x,y,z,对如下4组表达式判断正确的选项()
Int a1=x+y-z; int b1=x*y/z;
Int a2=x-z+y; int b2=x/z*y;
Int c1=x<>z; int d1=x&y|z; //<< ( 左移) >>(右移) &(按位与,清零时,取某些位) |(按位或)
Int c2=x>>z<
void Translate(int a[], int b[], int n)
{
b[0] = 1;
for (int i = 1; i <= n-1; i++)
{
b[i] = b[i-1]*a[i-1];
}
//b[1] = a[0]
//b[2] = b[1]*a[1] = a[0]*a[1]
//...
//b[i] = a[0]*a[1]..a[i-1]
//b[n-1] =a[0]..a[n-2]
for (int i = n-1; i >= 1; i--)
{
b[i] *= b[0];
b[0] *= a[i];
}
//b[n-1] = b[0]*b[n-1] = b[n-1] = a[0]..a[n-2] b[0] = a[n-1]
//b[n-2] = b[0]*b[n-2] = a[n-1]*b[n-2] = a[0]..a[n-3]*a[n-1] b[0] = a[n-2]*a[n-1]
//...
// b[0] = a[i+1]*...*a[n-1]
//b[i] = b[0]*b[i] = b[0]*a[0]*a[1]..a[i-1] = a[0]*a[1]..a[i-1]*a[i+1]*...*a[n-1]
}