zoukankan      html  css  js  c++  java
  • 2012-10-9杭州阿里巴巴研发笔试题目

    1、参考答案:C。

    2、参考答案:D。

    解析:对于8位二进制数,对于一个负数,|原码| + 补码 = 1 0000 0000, 所以如果求补码 = 1 0000 0000 - |原码|
    同理,对于4位三进制数,对于一个负数,|原码| + 补码 = 1 0000, 所以如果求补码 = 1 0000 - |原码|
    对于这道题,|-10|三进制为0101,则其补码 = 1 0000 - 0101 = 2122, 所以选D

    3、参考答案:A。

    4、参考答案:B。

    解析:假设进程为A、B、C,最大可申请的资源数为3个,如果这三个进程申请资源的顺序为:A-A-B-B-C-A-B-C,此时A占有两个进程,B占有两个进程,C占有一个进程,接下来A、B、C同时需要再申请一个资源,需要互相等待对方释放一个资源,则造成了死锁;假设最大可申请的资源数为2个,则必然有一个进程可以被满足,不会造成死锁。 

    5、参考答案:

    6、参考答案:

    参考答案:A。解析详见http://os.chinaunix.net/a2012/0203/1306/000001306508.shtml

    7、参考答案:D。深度优先搜索(DFS)类似于树的先序遍历,递归实现;广度优先搜索(BFS),必须借助一个队列实现,以记忆正在访问的顶点的下一层顶点。

    8、参考答案:A。

    9、参考答案:

    10、参考答案:D。

    解析:自己的理解:首先从6双中选一双同色的有C(6,1)=6种选择,接着取第三只鞋,有10中选择,取第四只鞋时,有8种选择,但由于选择与次序无关,所以共有6*10*8/2=240。别人的理解:6对也就是12只,第一只就有12种取法.要有一对颜色相同,则第二只有一种取法,也就是第一只同颜色的那只.第三只和第四只就只剩下其余5对中每种颜色取一只,也就是五种和四种.所以取法就是:12*1*5*4=240。比较还是别人的理解更清晰。由此题我联想到错排问题,给出错排公式D(n) = n! [(-1)^2/2! + … + (-1)^(n-1)/(n-1)! + (-1)^n/n!]。

    11、参考答案:D。

    ping:Ping是Windows下的一个命令在Unix和Linux下也有这个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障

    traceroute:该诊断实用程序通过向目的地发送具有不同生存时间 (TTL) 的 Internet 控制信息协议 (ICMP) 回应报文,以确定至目的地的路由。

    telnet: Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。telnet和ssh的区别:ssh 是加密的,基于 SSL 。telnet 是明码传输的,发送的数据被监听后不需要解密就能看到内容。两个不通用,现在不建议使用telnet 。搜索因为现在网络监听手段十分的发达。而且中间人攻击也很容易。

    netstat:Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IPTCPUDPICMP协议相关的统计数据,一般用于检验本机各端口网络连接情况

    12、参考答案:A。

    13、参考答案:CD。复习一下正则表达式。

    14、参考答案:AC。

    18、甲包8个红球 2个蓝球,乙包2个红球 8个蓝球。抛硬币决定从哪个包取球,取了11次,7红4蓝。注,每次取后还放进去,只抛一次硬币。问选的是甲包的概率?
    点评:
    贝叶斯公式 + 全概率公式作答(参看链接:http://www.doc88.com/p-132711202556.html具体解答如下图所示:

    第19题和20题目个答案来自于:http://blog.csdn.net/twtsa/article/details/8055143

    a在排序后的位置是[i-k, i+k],a[i+2k]在排序后的位置是[i+k, i+3k],必然有a <= a[i+2k]

    所以数组a里实际上有2k个各自有序的、交错的子序列,如a1={a[0], a[2k], a[4k]...},a2={a[1], a[2k+1], a[4k+1], ...}

    所以可以用2k-路归并排序,用一个大小为2k的小顶堆辅助归并,时间复杂度是O(n*log2k),小于O(nk)。

     

    个人方案:时间复杂为o(n*lgk),

    基本思想:

    方案:申请一个大小为k的堆,用0-k-1个数组的元素初始化这个堆。现在把第k个数组元素和堆顶相比较,如果比堆顶元素小,直接输出该第k个元素。如果大,淘汰堆顶的元素(输出堆顶元素),把第k个元素加到堆中,调整堆,调整的复杂度是lgk,这样需要操作n次,复杂度是n(lgk)。 ps:借助外排序的败者树的思想。

    20题:字符串数组seq[] = a,b,c,d,aa,ba,ca,da,ab,bb,cb,db,ac...,aaa,baa,...

    (1)aaa是第几个字符串

    (2)ababacd是第几个

    (3)第1000个字符串是什么

    (4)编写函数find(),返回字符串在seq中是第几个(语言不限)

    分析:

    (1).长度,很容易推导出长度是n的字符串在第4^(n-1)个之后,aaa是1位和2位全排列后的第一个,即第4^(3-1)+4^(2-1)之后的第一个,也即第21个

    (2)字符,每个字符可以判断出它之前的字符全排列了多少次,

    字    符: a b a b a c d

    全排列: 0 1 0 1 0 2 3

    4^次幂: 0 1 2 3 4 5 6

    即1*4^1+1*4^3+2*4^5+3*4^6 = 14405(考场不让用计算器...换成2的次幂来算)

    (3)把1000转为二进制是 11 11 10 10 00

    他们分别对应4进制里的 3    3   2   2   0

    对应字符就是 d d c c a,倒序就是accdd,这里算出来的是1001的字符串

    第1000个是上一个, 即 accdd-1 = dbcdd

    (4)可执行代码如下:

    1. #include <iostream> 
    2. #include <string> 
    3. using namespace std; 
    4.  
    5. long find(char seq[]){ 
    6.     long sum=1; 
    7.     long tmp=1; 
    8.     int len = strlen(seq); 
    9.     for (int i=0;i<len;i++) 
    10.     { 
    11.         sum+=(seq[i]-'a')*tmp; 
    12.         tmp*=4; 
    13.     } 
    14.     return sum; 
    15.  
    16. int main(){ 
    17.     cout<<find("ababacd")<<endl; 
    18.     cout<<find("dbcdd")<<endl; 
    19.     return 0; 
    复制代码

    ---恢复内容结束---

    ---恢复内容结束---

    1、参考答案:C。

    2、参考答案:D。

    解析:对于8位二进制数,对于一个负数,|原码| + 补码 = 1 0000 0000, 所以如果求补码 = 1 0000 0000 - |原码|
    同理,对于4位三进制数,对于一个负数,|原码| + 补码 = 1 0000, 所以如果求补码 = 1 0000 - |原码|
    对于这道题,|-10|三进制为0101,则其补码 = 1 0000 - 0101 = 2122, 所以选D

    3、参考答案:A。

    4、参考答案:B。

    解析:假设进程为A、B、C,最大可申请的资源数为3个,如果这三个进程申请资源的顺序为:A-A-B-B-C-A-B-C,此时A占有两个进程,B占有两个进程,C占有一个进程,接下来A、B、C同时需要再申请一个资源,需要互相等待对方释放一个资源,则造成了死锁;假设最大可申请的资源数为2个,则必然有一个进程可以被满足,不会造成死锁。 

    5、参考答案:

    6、参考答案:

    参考答案:A。解析详见http://os.chinaunix.net/a2012/0203/1306/000001306508.shtml

    7、参考答案:D。深度优先搜索(DFS)类似于树的先序遍历,递归实现;广度优先搜索(BFS),必须借助一个队列实现,以记忆正在访问的顶点的下一层顶点。

    8、参考答案:A。

    9、参考答案:

    10、参考答案:D。

    解析:自己的理解:首先从6双中选一双同色的有C(6,1)=6种选择,接着取第三只鞋,有10中选择,取第四只鞋时,有8种选择,但由于选择与次序无关,所以共有6*10*8/2=240。别人的理解:6对也就是12只,第一只就有12种取法.要有一对颜色相同,则第二只有一种取法,也就是第一只同颜色的那只.第三只和第四只就只剩下其余5对中每种颜色取一只,也就是五种和四种.所以取法就是:12*1*5*4=240。比较还是别人的理解更清晰。由此题我联想到错排问题,给出错排公式D(n) = n! [(-1)^2/2! + … + (-1)^(n-1)/(n-1)! + (-1)^n/n!]。

    11、参考答案:D。

    ping:Ping是Windows下的一个命令在Unix和Linux下也有这个命令。ping也属于一个通信协议,是TCP/IP协议的一部分。利用“ping”命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障

    traceroute:该诊断实用程序通过向目的地发送具有不同生存时间 (TTL) 的 Internet 控制信息协议 (ICMP) 回应报文,以确定至目的地的路由。

    telnet: Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。telnet和ssh的区别:ssh 是加密的,基于 SSL 。telnet 是明码传输的,发送的数据被监听后不需要解密就能看到内容。两个不通用,现在不建议使用telnet 。搜索因为现在网络监听手段十分的发达。而且中间人攻击也很容易。

    netstat:Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。Netstat用于显示与IPTCPUDPICMP协议相关的统计数据,一般用于检验本机各端口网络连接情况

    12、参考答案:A。

    13、参考答案:CD。复习一下正则表达式。

    14、参考答案:AC。

    18、甲包8个红球 2个蓝球,乙包2个红球 8个蓝球。抛硬币决定从哪个包取球,取了11次,7红4蓝。注,每次取后还放进去,只抛一次硬币。问选的是甲包的概率?
    点评:
    贝叶斯公式 + 全概率公式作答(参看链接:http://www.doc88.com/p-132711202556.html具体解答如下图所示:

    第19题和20题目个答案来自于:http://blog.csdn.net/twtsa/article/details/8055143

    a在排序后的位置是[i-k, i+k],a[i+2k]在排序后的位置是[i+k, i+3k],必然有a <= a[i+2k]

    所以数组a里实际上有2k个各自有序的、交错的子序列,如a1={a[0], a[2k], a[4k]...},a2={a[1], a[2k+1], a[4k+1], ...}

    所以可以用2k-路归并排序,用一个大小为2k的小顶堆辅助归并,时间复杂度是O(n*log2k),小于O(nk)。

     

    个人方案:时间复杂为o(n*lgk),

    基本思想:

    方案:申请一个大小为k的堆,用0-k-1个数组的元素初始化这个堆。现在把第k个数组元素和堆顶相比较,如果比堆顶元素小,直接输出该第k个元素。如果大,淘汰堆顶的元素(输出堆顶元素),把第k个元素加到堆中,调整堆,调整的复杂度是lgk,这样需要操作n次,复杂度是n(lgk)。 ps:借助外排序的败者树的思想。

    20题:字符串数组seq[] = a,b,c,d,aa,ba,ca,da,ab,bb,cb,db,ac...,aaa,baa,...

    (1)aaa是第几个字符串

    (2)ababacd是第几个

    (3)第1000个字符串是什么

    (4)编写函数find(),返回字符串在seq中是第几个(语言不限)

    分析:

    (1).长度,很容易推导出长度是n的字符串在第4^(n-1)个之后,aaa是1位和2位全排列后的第一个,即第4^(3-1)+4^(2-1)之后的第一个,也即第21个

    (2)字符,每个字符可以判断出它之前的字符全排列了多少次,

    字    符: a b a b a c d

    全排列: 0 1 0 1 0 2 3

    4^次幂: 0 1 2 3 4 5 6

    即1*4^1+1*4^3+2*4^5+3*4^6 = 14405(考场不让用计算器...换成2的次幂来算)

    (3)把1000转为二进制是 11 11 10 10 00

    他们分别对应4进制里的 3    3   2   2   0

    对应字符就是 d d c c a,倒序就是accdd,这里算出来的是1001的字符串

    第1000个是上一个, 即 accdd-1 = dbcdd

    (4)可执行代码如下:

    1. #include <iostream> 
    2. #include <string> 
    3. using namespace std; 
    4.  
    5. long find(char seq[]){ 
    6.     long sum=1; 
    7.     long tmp=1; 
    8.     int len = strlen(seq); 
    9.     for (int i=0;i<len;i++) 
    10.     { 
    11.         sum+=(seq[i]-'a')*tmp; 
    12.         tmp*=4; 
    13.     } 
    14.     return sum; 
    15.  
    16. int main(){ 
    17.     cout<<find("ababacd")<<endl; 
    18.     cout<<find("dbcdd")<<endl; 
    19.     return 0; 
    复制代码

    ---恢复内容结束---

  • 相关阅读:
    $(document).ready() 、 $('#id').load() 、window.onload 的区别
    Ajax的Get和Post的区别
    jquery slideDown slideUp 对于table无效
    .net 中连接mysql
    数据库日志文件太大如何处理
    支持IE,FireFox,Chrome三大主流浏览器,通过js+Flash方式将table导出Excel文件
    Sql2008的行列转换之行转列
    Java 8最快的垃圾收集器是什么?
    window.location.hash属性介绍
    高并发量网站解决方案
  • 原文地址:https://www.cnblogs.com/hzhtracy/p/4444586.html
Copyright © 2011-2022 走看看