2017阿里研发工程师C/C++实习生招聘笔试题

笔试

时间:2017.04.26,120分钟
题型:单选题20道(40分钟),在线编程2道(80分钟)

单选

1.下面哪种作业调度算法适用于处理紧急任务
( ) 先来先服务算法
( ) 短作业优先算法
( ) 优先权调度算法
( ) 时间片轮转算法
( ) 多级反馈队列算法
( ) 高响应比优先算法

2.北京通常有1/4的概率有雾霾,当你出差去北京需要决定是否带口罩。你会随机问在北京的3个同事。每个同事有3/4的概率说真话。当3个同事都说北京有雾霾的时候,问实际上有多大概率北京有雾霾。
( ) 63/64
( ) 3/4
( ) 1/4
( ) 27/64
( ) 9/10
( ) 37/64

3.新生军训,一个小组有8个人,排成一排操练。为了让组内同学都互相认识,指导员每天都在重新排队,保证任意相邻的同学之前都没有被安排相邻过。按这个规则最多可以重排多少天?
( ) 2
( ) 3
( ) 4
( ) 5
( ) 6
( ) 7

4. 请阅读下面代码,判断可被垃圾回收的对象

public class TestGC
{
    private static TestGC m_t;

    public void assign(TestGC t)
    {
        m_t = t;
    }

    public void clear(TestGC t)
    {
        t = null;
    }

    public static void main(String[] args)
    {
        TestGC t1 = new TestGC();
        TestGC t2 = new TestGC();
        TestGC t3 = new TestGC();

        t1.assign(t2);
        t1 = null;
        t2 = null;
        t3.clear(t3);

        System.out.printIn("This point");
    }
}

当程序执行到“System.out.printIn”这行时,可被虚拟机回收的对象有:
( ) t1
( ) t1、t2
( ) t2、t3
( ) t1、t3
( ) t1、t2、t3
( ) t1、t2、t3全都不可回收

5. 请阅读下面代码,计算运行结果:
TaskBGThread.java定义如下

public class TaskBGThread extends Thread
{
    private int i = 1;

    public void run()
    {
    System.out.print("TaskBG"+i);
    i++;
    }
}

TaskThread.java定义如下

public class TaskBGThread implements Runnable
{
    private int i = 1;

    public void run()
    {
    System.out.print("TaskBG"+i);
    i++;
    }

    public static void main(String[] args)
    {
    Runnable runner = new TaskThread();
    Thread thTask1 = new Thread(runner);
    thTask1.run();
    Thread thTask2 = new Thread(runner);
    thTask2.start();
    Thread thTaskBG1 = new TaskBGThread();
    thTaskBG1.start();
    Thread thTaskBG2 = new TaskBGThread();
    thTaskBG2.start();
    }
}

以上程序的运行结果可能会出现的是
( ) Task1Task2TaskBG1TaskBG2
( ) Task2Task1TaskBG1TaskBG2
( ) Task1Task1TaskBG1TaskBG2
( ) Task2Task2TaskBG1TaskBG2
( ) Task1Task2TaskBG1TaskBG1
( ) Task1Task1TaskBG1TaskBG1

6 .

public class TestFinally
{
    public static void main(String[] args) throws InterruptedException
    {
        Runnable s = new Runnable()
        {
            public void run()
            {
                try
                {
                    System.out.print("线程开始执行");
                    Thread.sleep(1000);
                    System.out.print("线程执行完毕");
                }

                catch (InterruptedException e)
                {
                    System.out.print("睡眠中发生中断");
                }
                finally
                {
                    System.out.print("finally块被调用了");
                }
            }
        };
        Thread thread = new Thread(s);
        thread.setDaemon(true);
        thread.start();
        Thread.sleep(500);
    }
}

程序执行后,输出的内容最可能是以下的哪种情况:
( ) 线程开始执行 线程执行完毕 睡眠中发生中断 finally块被调用了
( ) 线程开始执行 睡眠中发生中断 finally块被调用了
( ) 线程开始执行 finally块被调用了
( ) 线程开始执行
( ) 线程开始执行 finally块被调用了 睡眠中发生中断
( ) 没有输出

7.

public class TestAtomicInteger
{
    public static void main(String[] args)
    {
        final AtomicInteger tickets = new AtomicInteger(10);
        Runnable s = new Runnable()
        {
            public void run()
            {
                while(ture)
                {
                    int ticket = tickets.updateAndGet(n -> (n > 0) ? n -1 : n);
                    //ticket代表售出的票
                    System.out.print(ticket + " ");
                    if (ticket <= 0)
                    { break;}
                }
            }
        };
        Thread t1 = new Thread(s);
        Thread t2 = new Thread(s);
        t1.start();
        t2.start();
    }
}

以下说法正确的是:
( ) 结果不会发生超卖,因为AtomicInteger是线程安全的
( ) 结果会发生超卖,且超卖的票号不确定
( ) 结果会发生超卖,且超卖的票号一定是最后一张
( ) 结果会发生超卖,且超卖的票号一定是最先卖出的那张
( ) 超卖可能会发生,也可能不会发生
( ) 以上都不对

8 . 已知元素和对应的哈希值如下:
元素 A B C D E F G
哈希值 3 1 4 1 5 2 5

基于线性探测哈希法,按照某种顺序,将上面元素插入到长度为7的哈希表中,则下面哪种情况是可能的正确结果:
(1)
0 1 2 3 4 5 6
G B D F A C E

(2)
0 1 2 3 4 5 6
B G D F E C A

(3)
0 1 2 3 4 5 6
E G F A B C D

(4)
0 1 2 3 4 5 6
G B D A C E F

( ) (1)
( ) (1) + (2)
( ) (1) + (4)
( ) (2) + (3)
( ) (3) + (4)
( ) (1) + (2) + (3) + (4)

9. 以下说法正确的是()

#include <iostream>

int f(int i)
{
    if (i <= 0)
    { return 1; }
    return i*f(i - 1);
}

int main()
{
    for (size_t i = 10; i >= 0; --i)
    {
        std::cout<<f(i)<<std::endl;
    }
    return 0;
}

( ) 正常输出1~10的阶乘
( ) 正常输出0~10的阶乘
( ) 正常输出0~2^32-1的阶乘
( ) 死循环
( ) 编译错误
( ) 运行错误

10.一个淘宝外卖小哥在望京某高档社区迷了路。他的勉强有三条路,第一条路3分钟就能出去,第二条路5分钟绕回原地,第三条路10分钟绕回原地。估计外卖小哥要花多少时间出去
( ) 15
( ) 16
( ) 17
( ) 18
( ) 19
( ) 25

11.有一组记录排序码(1 9 6 2 5 4 7 3)需要进行堆排序,请问在堆化(小根堆)之后,堆所对应的二叉树后序遍历序列为:
( ) (9 3 2 5 1 6 4 7)
( ) (9 3 5 2 6 7 4 1)
( ) (9 2 3 1 4 4 6 7)
( ) (9 3 2 5 6 7 4 1)
( ) (9 3 2 5 6 1 4 7)
( ) (9 2 3 5 6 7 4 1)

12.下列关于Linux中inode的描述正确的是:
( ) inode包含文件的全部信息
( ) inode不会消耗硬盘空间
( ) 文件目录没有对应的inode信息
( ) 多个文件能指向同一个inode
( ) inode中包含有文件名的信息
( ) 移动或者修改文件会生成新的inode

13. A和B两个团队在合作p项目,B团队做p项目子项目p1,A团队做子项目p2,p2部分依赖于p1,A和B的主管不是同一个人,后来p1项目衍生出来一个附属项目s,B团队做了一段时间后,B团队由于有其他紧急项目B团队的主管M让B团队的兄弟团队C团队做s项目,同时p1项目也调走了几个人,A团队不开心,这干扰了A团队在p2项目中的项目进度,而且A团队由于之前跟C团队合作不顺畅,不是很认可C团队的能力。A团队以下做法中最不恰当的是:
( ) 自己加大投入,接管BC团队的所有工作
( ) 私下向大boss告状,质疑B团队的合作精神以及C团队的能力
( ) 与主管M理论,要求B团队充分重视p项目,加强p2和s项目的投入,反对C团队加入
( ) 放弃p项目,从项目中撤出所有人员,转去做其他项目
( ) 将BC团队召集在一起沟通,让他们改变计划,确保p计划顺利完成
( ) 重新制定项目计划,引入自己认可的D团队接手B团队的所有任务

14.下面关于无线开发论述错误的是?
( ) 无线开发需要特别关注应用的稳定运行和良好体验
( ) 虽然近来移动设备的性能提升明显,但目前无线开发仍需要重点关注内存,线程等系统资源的合理使用
( ) Hybride技术是一种兼顾原生体验实现快速迭代的无线应用开发方式
( ) 使用C/C++语言可以用来开发跨平台(iOS,Android)的功能库
( ) Flex作为一种网页布局方案,同样被应用在ReactNative,Weex等无线方案中
( ) Instrument是Android中用于性能优化的调试工具

15.以下对L0,L1,L2正则项描述不正确的是:
( ) L0正则化表示非零参数的个数
( ) L1正则化表示各个参数绝对值之和
( ) L2正则化表示各个参数的平方的和的开方值
( ) L1是光滑连续的
( ) L1范数可以看做是L0凸函数近似
( ) L1范数会使权值稀疏

16.公司某项目有A,B,C共3位工程师,一个java开发工程师,一个前端工程师,一个测试工程师。C的入职年限比测试工程师长,A和前端开发工程师不是同一年入职,前端开发工程师比B晚入职。根据上面的描述,可以推出以下哪个结论:
( ) A是java开发工程师,B是前端开发工程师,C是测试工程师
( ) A是前端开发工程师,B是java开发工程师,C是测试工程师
( ) A是前端开发工程师,B是测试工程师,C是java开发工程师
( ) A是测试工程师,B是java开发工程师,C是前端开发工程师
( ) A是java开发工程师,B是测试工程师,C是前端开发工程师
( ) A是测试工程师,B是前端开发工程师,C是java开发工程师

17. 36辆赛车参加比赛,赛车车速是定值,但每个赛车车速各不相同。当前只有6个赛道,无法计时,每场只能知道6辆车的相对快慢,请问最少几场比赛可以找出36辆车速度最快的前3名?
( ) 6场
( ) 7场
( ) 8场
( ) 9场
( ) 10场
( ) 11场

18. MySQL是常用的数据库,找出以下错误的表述
( ) MyISAM和InnoDB数据存储引擎都是用B+TREE索引
( ) PRIMARY KEY一定是唯一索引
( ) HASH索引的性能一定优于BTREE索引
( ) 使用多列索引时,如果查询条件没有指定索引的第一列则不用索引
( ) 使用普通单列索引时,如果查询条件中带有函数则无法使用到索引
( ) InnoDB存储引擎,尽量采用自增字段做主键的性能更好

19. 设一棵完全二叉树共有799个结点,则该二叉树中的叶子结点数为:
( ) 398
( ) 399
( ) 400
( ) 401
( ) 402
( ) 403

20. 以下关于stl容器说法错误的是()
( ) vector存储使用连续内存,当push_back超出所拥有内存上限时,会发生数据的整体复制迁移
( ) list存储内存不连续,其插入、删除性能好于vector,但不能像vector一样随机访问
( ) map作为KV结构,底层使用Hash表存储数据,随机访问时间复杂度接近O(1)
( ) set中不允许存储相同的值,需要查找元素的时间复杂度为O(logn)
( ) 自定义对象如要放到容器里,需要实现拷贝构造函数
( ) string可以当成char容器来使用,支持常见容器操作,且swap操作的时间复杂度与长度无关


在线编程

【1】做股票的人总会忍不住幻想:如果知道明天怎样就好了。那么问题来了,如果打开上帝视角,你最好能做到怎样?
真实世界的股票交易规则太复杂,我们这里做一些简化。首先我们假设有N个股票和M个交易期。
可以认为在单个交易期内所有股票的价格都是恒定的。股票卖出需要缴纳交易额的P倍的印花税。股票可以零碎地买卖,即,你买个0.01股也是可以的。
我们这个市场里没有停牌,没有休市,没有涨停跌停,没有买空卖空,没有分红,而且股票价格也不会跌到零。

举个例子,假设你用手里的一元钱买了个股票。这个股票第一期价格1元/股,你买入之后手上有1股股票和0元现金。
这个股票在第二期涨到2元/股,那么你这时卖出1股就获得了2元(税前),扣除10%的印花税,你手上没有股票却有1.8元现金。

如果你在一开始有1元现金,在M个交易期之后,你最多能持有多少现金?

编程说明
编译器版本: gcc 4.8.4
请使用标准输入输出(stdin,stdout) ;请把所有程序写在一个文件里,勿使用已禁用图形、文件、网络、系统相关的头文件和操作,如sys/stat.h , unistd.h , curl/curl.h , process.h

时间限制: 1S (C/C++以外的语言为: 3 S)
内存限制: 64M (C/C++以外的语言为: 576 M)

输入:
第一行是两个正整数N和M以及一个浮点数P。随后是M行,每行N个浮点数,代码某期(行)内某股票(列)的价格。

输出:
M期后你持有的现金,一个精确到小数点后一位的浮点数。

输入范例:
1 2 0.1
1
2

输出范例:
1.8



【2】多多岛上有很多小火车, 在提茅斯机房由原来的放射性火车库排列改成了新的车库,每个车库只能存放一辆小火车,每个小火车进到车库只能是单行。每个小火车出车库由一个天车把移动钢轨放到车库前,然后该列上的小火车从下而上优先出库。你能帮胖总管实现火车出站调度吗?

编程说明
编译器版本: gcc 4.8.4
请使用标准输入输出(stdin,stdout) ;请把所有程序写在一个文件里,勿使用已禁用图形、文件、网络、系统相关的头文件和操作,如sys/stat.h , unistd.h , curl/curl.h , process.h

时间限制: 1S (C/C++以外的语言为: 3 S)
内存限制: 64M (C/C++以外的语言为: 576 M)

输入:

#include <map>
#include <vector>
#include <queue>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
/* a / \ b c / \ / \ d e f g \ / \ h j i \ k \ l //层级遍历
a:托马斯(Thomas) b:艾德华(Edward) c:亨利(Henry) d:高登(Gordon) e:詹姆士(James) f:培西(Percy) g:托比(Toby)
h:达克(Duke) j:唐纳德&道格拉斯(Donald&Douglas) j:奥利佛(Oliver) k:亚瑟(Arthur) l:艾蜜莉(Emily) */

struct BT
{
int key;
BT *l, *r;
};

BT* create_n(int key)
{

}

bool train_schedule(BT* rt, int index)
{
    if (!rt) return false;
    map<int, string> m_train;
    m_train[0] = "Thomas";
    m_train[1] = "Edward";
    m_train[2] = "Henry";
    m_train[3] = "Gordon";
    m_train[4] = "James";
    m_train[5] = "Percy";
    m_train[6] = "Toby";
    m_train[7] = "Duke";
    m_train[8] = "Donald&Douglas";
    m_train[9] = "Oliver";
    m_train[10] = "Arthur";
    m_train[11] = "Emily";
//TODO:write the real train schedule code here return true;
}

int main()
{
    int i = 0;
    BT *rt = create_n('a');
    rt->l = create_n('b');
    rt->r = create_n('c');
    rt->l->l = create_n('d');
    rt->l->r = create_n('e');
    rt->r->l = create_n('f');
    rt->r->r = create_n('g');
    rt->r->l->r = create_n('h');
    rt->r->r->r = create_n('i');
    rt->r->r->l = create_n('j');
    rt->r->r->l->r = create_n('k');
    rt->r->r->l->r->r = create_n('l');
    std::cin >> i;
    train_schedule(rt,i);
    return 0;
}

输出:
输出小火车的出站顺序

输入范例:
1

输出范例:
Emily Donald&Douglas



希望对你有用!
欢迎分享答案。
2017.04.26

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值