阿里2015实习生-客户端笔试题目解析

文/BlackSwift(简书作者)
原文链接:http://www.jianshu.com/p/027cbf1cb6f6
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

职位:2015实习生-客户端开发工程师
考试时间:笔试,基本40分钟 + 附加80分钟
如果你有比我答案更好方法的话,欢迎留言~ 已经修改多次了。


1.在网络传输数据时,经常需要将二进制数据转换为一个可打印字符串,一般用到的可打印字符集合包含64个字符,因此又称为Base64表示法,现有一个char数组长度为12,要将它表示为Base64字符串,请问Base64字符串至少需要几个char;如果char的长度为20,则需要几个char。

解答:
char是一个基本数据类型。它可以表示一个byte大小的数字,即8位,而Base64使用基于6位的编码。所以就是12x 8/6 = 16;而20 x 8/6 = 20 x 4/3 = 24 + 2.666 ,多余的需要用 ====补齐到4位,所以是28。

答案:16,28

应用实例:

  1. 在HTTP GET/POST中一般都需要对参数进行base64编码
  2. 在iOS中的.plist文件中的<data>数据是Base64编码的
  3. <img src>中直接传输Base64作为图片

2.某部门年会的时候,有个环节叫做《国王和天使》,每个人将自己的名字写在纸条上并丢入盒子中,等所有人都完成该动作后,每个人再从盒子里拿出一张小纸条,上面的人物就是自己的国王,自己就是ta的天使,如果抽到自己,就再抽一遍,直到抽到别人为止,如果用有向图来表示他们之间的关系,那么以下结论错误的是_?

1. 最后的结果可能是存在多个联通分支
2. 联通分支个数最多不超过人数的二分之一
3. 最后的结果可能是存在多个强联通分支
4. 可以用深度优先算法求得联通数
5. 可以用双向链表存储其结构
6. 遍历的复杂度是O(N)

解答:
这个题目有三个BUG,当是人数三个人(或者奇数)时,其中两个人互相抽取的话,总有一个人抽不到,这个人就活该单身吗?还有个问题就是,在数学中一般翻译为“连通”而不是“联通"; 最后一个问题就是,连通数这个概念我没有在离散的书上找到,谷歌上也很少搜到。所以我认为这是一个不严谨不负责任的题目。

接下来是我的分析,我们先假设,当出现四个人的时候(偶数特例),两两成环的话,答案123都是对的。

接着答案五也是对的,这个结构明显就是链表。

第六的复杂度等于 O(线 + 边),肯定在2N左右,所以也是对的。

最后我们排除出来的是4。对于4的理解,我认为它只能求出连通通路的个数,而不是连通数。

所以,答案是4。

是不是看晕了?看来需要自学一遍离散了 ---> 点我


3.假设支付宝红包口令支持1到6位的数字组合,即'0','1','003'和‘999999’都是合法的红包口令,那么总共可以有多少个合法的红包口令?

解答:高中概率题,注意'1','000001'与'001'是不一样的就可以理解了。10 + 100 + 1000 + 10000 + 100000 + 1000000 = 1111110


4.假设某棵二叉查找树的所有键均为1到10的整数,现在我们要查找下面_是不可能是键的检查序列。

1. 1098765
2. 2863745
3. 129387465
4. 2310485
5. 49875
6. 以上均正确

解答:
一个个按照BST画呗,然后找出有分叉的,第二个是错的。


5.能整除1400的数目是__?

解答:

笔试的时候我直接跳了,毕竟2分钟算这个划不来。

后来问了学长,有了一个新的方法。

首先 1400 = (2x2x2) x (5x5) x7

然后我们计算 2 ,有 1 2 4 8 共4个

计算 5 , 有 1 5 25 共3个

计算 7 , 有 1 7 共2个

最后就是 4 x 3 x 2 = 24 个。

(我看到百度知道上有人在考试时间去问题目,非常鄙视这种行为)


6.设二叉树节点的前序遍历,中序遍历与后序遍历,所有叶子节点的先后顺序__

解答:
三者是相同的,遍历顺序不影响叶子节点


PreOrder Travesal

7.一个具有513个节点的二叉树,有_种可能的层高。

解答:
513 = 511 + 2

  • 如果是完全树的话,就是
    2^count - 1= 511 => count = 9 ,完全树是9层,然后加上一个小尾巴,就是10层。
  • 接着,我们考虑最差的情况,就是树退化为链表,这时 count = 513;

所以[10,513],就是513-10 + 1 = 504;


8.给定一个整数sum,从有N个无序元素的数组中寻找元素a,b,c,d,使得a + b + c + d = sum,最快的平均时间复杂度是_?

1. O(N^2)
2. O(log N)
3. O(N)
4. O(N^3)
5. O(N^2logN)
6. O(N^4)

解答:5

见评论,做不出来就蒙带Log的,没问题。


9.如下SQL数据中,_可能返回null值。

1. select count(*) from t1;//返回行的个数
2. select max(col1) from t1;//返回列中的某个最大值
3. select concat('max=' ,maxof(col1)) from t1;//连接字符

解答:
如果concat连接的字符中参数为空的话,则返回为空。
http://zhidao.baidu.com/question/1669729226131857827


10.函数lg(ax^2 - 8x + a - 6)的值域为R,那么实数a的取值范围是_

解答:

ax^2 - 8x + a - 6 > 0
当 a > 0 ,Δ > 0
    64 - 4a^2 + 24a > 0,
    16 - a^2 + 6a > 0
    a^2 - 6a -16 <0
    (a + 2)(a - 8) >0
    so , a>8
当 a < 0 , no way.

so , a>8


11.一个电动模型,每一组电池能让其行驶8分钟,一个充电器能同时给两组电池充电,一组充满需要15分钟,至少准备_组电池,可以让模型行驶完立即换电池行驶不用等待。

解答:
这个题目类似于CPU的异步调度。两组电池肯定不够的,假设有3组充满的电池,我们用笔划一划

int use = 8
int charge[2] = 0,0

use = 0
charge[2] = 0,0;

use = 8
charge = 15,0

use = 0
charge = 7,0;

use = 8
charge = 7,15;

use = 0;
charge = 15, 8;

所以3个是可以的。


12.对于下面的代码,正确的是?

char* s1 = "Hello world";
char s2[] = "Hello world";
s1[2] = 'E'; //1
s2[2] = 'E'; //2
*(s1 + 2) = 'E'; //3
*(s2 + 2) = 'E'; //4

解答:
s1是 char*类型,它指向常量字符串,而常量早已经在编译的时候就写入_DATA中了,是不可改变的;
s2是 char[]类型,它在程序栈上新开辟了一个数组空间,它需要复制字符串常量到栈空间的数组中。

所以1,3错的,剩下是对的。

最后附上表一张

int a[10];

 &aa*a
 A pointer which points to an arrayAn arrayThe first element of Array
Typeint *int [5]int
sizeof8(取决于OS)4x54
 &a + 2a + 2*a + 2
Typeint *int [5]int
Offset2 * sizeof( int [5])2 * sizeof( int) = 2x4没意义,简单的int相加

13.一台刚接入互联网的WEB服务器第一次被访问到时,不同协议的发生顺序是下面中的_

1.ARP->DNS->HTTP
2.ARP->HTTP->DNS
3.DNS->HTTP->ARP
4.DNS->ARP->HTTP
5.HTTP->ARP->DNS
6.HTTP->DNS->ARP

解答:
这道题无非就是DNS与ARP哪个快的问题。
有人认为:服务器插上网线需要在内网进行IP-MAC映射,也就是ARP。接着用户在浏览器输入地址,查找DNS,获取IP,最后以TCP的形式把HTTP封装,进行连接。
http://www.zhihu.com/question/29282648

我认为应该如下:

  1. 通过DNS,获取到IP
  2. HTTP是基于TCP的,需要 ARP -> Router -> Router -> ARP 对IP建立连接
  3. HTTP进行面向连接的访问

在浏览器中输入Google.com并且按下回车之后发生了什么?


14.忘了 %>_<%


15将整数序列(7-2-4-6-3-1-5-8)按所示顺序构建一颗二叉排序数a,之后将整数4按照二叉树排序规则从树a中删除,请问删除后树的前序遍历结果是_?

1. 1-2-3-4-5-6-7
2. 7-2-1-5-3-6-8
3. 3-6-1-5-2-8-7
4. 1-3-6-5-2-8-7
5. 8-7-6-5-3-2-1
6. 7-2-8-1-5-3-6

解答:二叉排序树,也叫二叉搜索树(Binary Search/Sort Tree),按照left < mid < right进行排序。找出4右树的最小值,也就是5,然后替换即可。前序遍历的话,看刚刚的三个遍历对比图就可以秒杀了,所以选择2

BST动画 ——>点我


16.以下程序运行结果?

#include<iostream>
using namespace std;
class cat{
    int age;
    public:
        //构造函数
        cat(){age = 1;}
        //析构函数,类似于Java的finalize
        ~cat(){}
        //一个公共方法
        void miao(void){
            cout<<"Miao,my age = "<<age<<endl;
        }
};

int main(void){
    cat kitty;
    int* p = (int*)(&kitty);
    *p = 20;
    kitty.miao();
    return 0;
}

解答:
实际输出的是Miao,my age = 20;类的内存分配类似于结构体,它的内部就是一个int,*p = 20实际上就是

mov dword[ss:rbp + p],0x14;

17.图中的每个圈圈的一个补给站,存储着一定数量的汽油,每个圈之间的路上标识来了这段路需要消耗的汽油量,一段小车从A点出发,在图上任意行走,到达补给站的时候可以取出所有的汽油,到达B点后最多剩余的汽油量是__?


阿里面试
 5,6,7,9,10,13中的哪一个?

解答:
这个是加权图,深度遍历,必须要纸笔画出来。花时间计算有些划不来,答案是10。如果猜的话,一般是倒数第二个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值