您的位置:首页 > 其它

笔试题基础(第三篇

2015-09-05 21:28 281 查看
1)无锁化编程有哪些常见方法?

A) 针对计数器,可以使用原子加

B) 只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)

C) RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法

D) CAS(Compare-and-Swap),如无锁栈,无锁队列等待

解答:D

2)设集合A={1,2,3},A上的关系R={(1,1),(2,2),(2,3),(3,2),(3,3)},则R不具备( )?

A) 自反性

B) 传递性

C) 对称性

D) 反对称性

解答:D

  假设集合A,以及基于A上的关系R

a) 自反: 如果a是A的元素,那么<a,a>是R的元素;

  即 a∈A  =》 <a,a>∈R

b) 反自反: 如果a是A的元素,那么<a,a>不是R的元素 ;

  即 a∈A  =》 <a,a>∉R

c) 对称:如果<a,b>是R的元素,那么<b,a>是R的元素 ;

  即 <a,b>∈R =》 <b,a>∉R

d) 反对称:如果<a,b>,<b,a>是R的元素,那么a,b相等;

  即 <a,b>∈R 且 <b,a>∈R =》 a = b

e) 传递:如果<a,b>,<b,c>是R的元素,那么<a,c>是R的元素;

  即 <a,b>∈R 且 <b,c>∈R  =》 <a,c>∈R

  由于 <3,2> ∈R 且 <2,3> ∈R ,但 3≠2,不满足”定义d)” ,即 R不满足“反对称性”。选D。

3)在N个乱序数字中查找第k大的数字,时间复杂度可以减小至?

A) O(N*logN)

B) O(N)

C) O(1)

D) O(2)

解答:B

  这是一个顺序统计量问题,用基数排序和桶排序均可做到O(n)。

4)IP数据报头采用()字节序,在此字节序下从低地址到高地址0x1234的表示形式为 () 。

A) big_endian,0x12 0x34 0 0

B) little_endian,0x34 0x12 0 0

C) big_endian,0 0 0x12 0x34

D) little_endian, 0 0 0x34 0x12

解答:C

  其实 big endian 是指低地址存放最高有效字节( MSB ),而 little endian 则是低地址存放最低有效字节( LSB )。

  比如,数字 0x12345678 在两种不同字节序 CPU 中的存储顺序如下所示:

  //数字:0x12345678

Big Endian:

低地址                                  高地址          
    ----------------------------------------->
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |    12   |   34    |   56   |   78   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


Little Endian:

低地址                                  高地址          
    ----------------------------------------->
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |    78   |   56    |   34   |   12   |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+


  从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。由于IP数据报头采用“big endian”,所以0x1234 的big endian形式为:0 0 0x12 0x34

5)有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。假设N较大,本机内存也很大,可以存下A、B和结果矩阵。那么,为了计算速度,A和B在内存中应该如何存储(按行存指先存储第一行,再第二行,直到最后一行;按列存指先存储第一列,再第二列,直到最后一列)?

A) A按行存,B按行存。

B) A按行存,B按列存。

C) A按列存,B按行存。

D) A按列存,B按列存。

解答:A

  这个题最开始我选的是B,想到的是传统矩阵相乘的方法,时间复杂度为O(n^3 ),但是这不是最优的方法,最优方法为Strassen矩阵相乘发,时间复杂度降低为O(n^2.81),用分治的思想将矩阵分块计算,在这个算法中按行存储更有利。所以正确答案为A。

6)Fill the blanks inside class definition

class Test
{
    public:
        ____ int a;
        ____ int b;
    public:
        Test::Test(int _a , int _b) : a( _a )
        {
             b = _b;
        }
};
int Test::b;
int main(void)
{
    Test t1(0 , 0) , t2(1 , 1);
    t1.b = 10;
    t2.b = 20;
    printf("%u %u %u %u",t1.a , t1.b , t2.a , t2.b);
    return 0;
}


Running result : 0 20 1 20

A) static/const

B) const/static

C) –/static

D) const static/static

E) None of above

解答:BC

  对于成员变量a,若它为const类型,那么必须要使用Test::Test(int _a , int _b) : a( _a )这种初始化形式,若它为普通成员变量,也可以采取Test::Test(int _a , int _b) : a( _a )这种形式,所以a可以为const或者普通类型,由于b没有采取Test::Test(int _a , int _b) : b( _b )这种形式,所以b一定不是const类型,有main()中的t1.b和t2.b的输出都是20可以知道,b是静态变量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: