【面试题】试卷分析——阿里巴巴2017年实习生笔试题(一)

本文分析了阿里巴巴2017年实习生笔试中关于C++ inline关键字的题目,强调了inline函数的使用条件及类内成员函数的默认性质。同时,涉及结构体内存对齐原则,解释了在64位处理器上结构体占用内存大小的计算。还涵盖了其他如排序算法时间复杂度、C语言vector和字符串查找问题的相关知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试卷网址:https://www.nowcoder.com/profile/3571951/test/13714416/44774#summary

1、C++ inline关键字

关于c++的inline关键字,以下说法正确的是()

正确答案: D   你的答案: 空 (错误)

使用inline关键字的函数会被编译器在调用处展开
头文件中可以包含inline函数的声明
可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数
定义在Class声明内的成员函数默认是inline函数
优先使用Class声明内定义的inline函数
优先使用Class实现的内inline函数的实现

A 项错误,因为使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。

B 项错误,头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用】

C 项错误, inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。

D 项正确,类内的成员函数,默认都是 inline 的。【定义在类声明之中的成员函数将自动地成为内联函数】

EF 项无意思,不管是 class 声明中定义的 inline 函数,还是 class 实现中定义的 inline 函数,不存在优先不优先的问题,因为因为 class 的成员函数都是 inline 的,加了关键字 inline 也没什么特殊的。


2、第二题和第十五题,排序算法的时间复杂度(参见博客  http://blog.youkuaiyun.com/qq_30141957/article/details/79428381



19、结构体占用内存大小(参考博客 http://blog.youkuaiyun.com/qq_30141957/article/details/79433090

struct st
{
    int *p;
    int i;
    char a;
};
int sz=sizeof(struct st);

如下C程序,在64位处理器上运行后sz的值是什么?

知识点:

1、struct的对齐原则,没有指定#pragma pack(n)的情况下,32位默认4字节对齐,64位系统默认8字节对齐

2、32位系统下,指针变量int*、char*等占用4字节,64位系统下,指针变量均占用8字节。

char=1; short=2; int=4; unsigned int=4; float=4; double=8; long=4;long long=8; unsigned long=4;

内存结构为: 1111 1111 1111 1xxx    成员总大小=13,由于需要补齐8的倍数,圆整=16


20、C语言 vector(参考http://blog.youkuaiyun.com/duan19920101/article/details/50617190/

#include <iostream>       
#include <vector>
using namespace std;
int main(void)
{
    vector<int>array;
    array.push_back(100);
    array.push_back(300);
    array.push_back(300);
    array.push_back(300);
    array.push_back(300);
    array.push_back(500);
    vector<int>::iterator itor;
    for(itor=array.begin();itor!=array.end();itor++)
    {
        if(*itor==300)
        {
            itor=array.erase(itor);
        }
    }
    for(itor=array.begin();itor!=array.end();itor++)
    {
            cout<<*itor<<"";
    }
  return 0;
}
下面这个代码输出的是()

正确答案: C   你的答案: E (错误)

100 300 300 300  300 500
100 3OO 300 300 500
100 300 300 500
100 300 500
100 500
程序错误



22、字符串查找

给定的一个长度为N的字符串str,查找长度为P(P<N)的字符串在str中的出现次数.下面的说法正确的是()

正确答案: D   你的答案: E (错误)

不存在比最坏时间复杂度O(NP)好的算法
不存在比最坏时间复杂度O(N^2)好的算法
不存在比最坏时间复杂度O(P^2)好的算法
存在最坏时间复杂度为O(N+P)的算法
存在最坏时间复杂度为O(log(N+P))的算法
以上都不对
朴素匹配算法 时间复杂度O((N-P+1)*P)
KMP匹配算法 时间复杂度为O(N+P)(详细算法参见我的博文 http://blog.youkuaiyun.com/qq_30141957/article/details/79426636

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值