笔试题基础(第三篇

57 篇文章 1 订阅
19 篇文章 1 订阅

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是静态变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sanqima

一键三连,多多益善

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值