淘宝技术类2011年校招笔试题

一、选择题(所有同学必答题,至少有一个选项是正确的,每题4分)
1.以下哪些命令可以解压缩.tar.bz2文件?()
A. tar -cjvf
B. tar -xjvf
C. tar -czvf
D. tar -xzvf
答:B
-c :建立一个压缩文件的参数指令(create 的意思);
-x :解开一个压缩文件的参数指令!
-t :查看 tarfile 里面的文件!
特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!
因为不可能同时压缩与解压缩。
-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?
-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?
-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!
-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!
   例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成
   『 tar -zcvPf tfile sfile』才对喔!
-p :使用原文件的原来属性(属性不会依据使用者而变)
-P :可以使用绝对路径来压缩!
-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中

2.Unix系统中,文件存储管理采用的是()
A. 位图法
B. 空闲块表法
C. 成组连接法
D. 单块连接法
答:C
位图法用的场合比较多,比如设备分配、PCB分配等,早期Linux的文件系统MINIX也使用位图。现在的ext2、ext3都不用了。
空闲块表法使用的场合也很多,比如内存分配等。
成组连接法用于文件系统,它将空闲块分成若干组,每100个空闲块为一组,每组的第一空闲块登记了下一组空闲块的物理盘块号和空闲块总数。如果一个组的第一个空闲块号等于0,则有特殊的含义,意味着该组是最后一组,即无下一个空闲块。分配空闲块的时候,从前往后分配,先从第一组开始分配,第一组空闲的100块分完了,才进入第二组。释放空闲块的时候正好相反,从后往前分配,先将释放的空闲块放到第一组,第一组满了,在第一组前再开辟一组,之前的第一组变成第二组。
单块连接法:不了解

3.以下硬盘分区方案中可行的是()/*P代表主分区,L代表逻辑分区*/
A. 2P + 1L
B. 3P + 2L
C. 4P + 3L
D. 5P + 4L
E. 6P + 5L
答:AB
各个分区的作用:
主分区用于启动操作系统
扩展分区用于建立逻辑分区。主分区数量有限,如果需要更多的分区,就在扩展分区上增加逻辑分区。
逻辑分区用于增加分区数量。
分区的数量规定:
主分区+扩展分区 <= 4 (排除DE)
逻辑分区 <= 12,逻辑分区必须建立在扩展分区上(C排除)

4.C语言中,下列哪两个定义是相同的?
A. const int* a = &b;
B. const* int a = &b;
C. const int* const a = &b;
D. int const* const a = &b;
答:AB CD
AB:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
CD:指针本身和指向的内容均为常量

5.关于下面的C语言代码片段,说法正确的是()
int test(char *src)
{
    char dest[102] = {0};
    strncpy(dest,src,strlen(src)-1);
    return 1;
}
A. 这段代码没有任何安全问题
B. 这段代码存在条件竞争漏洞
C. 这段代码存在栈溢出漏洞
D. 这段代码存在堆溢出漏洞
答:C
复制的长度是src-1,如果src-1>1024,dest就会溢出。因为dest是在栈中开辟的空间,所以是栈溢出

二、填空题(所有同学必答题,每道4分)
1.以下是linux系统中ls命令的一行输出结果:
drwxr-xr-x 14 root root 20K 2010-08-20 23:18 Photos 共有7个字段,意义分别是 文件类型及访问权限该目录所包含的子目录的个数文件的拥有者文件拥有者所在的组文件所占用的空间(以字节为单位)文件最近访问时间文件名
 
2.某二叉树,先序遍历的结果为BACEDFG,中序遍历的结果为CAEBFGD,其后序遍历的结果为 CEAGFDB
答:图略
 
3.代码覆盖测试分: 语句覆盖判定覆盖条件覆盖路径覆盖
答:
    代码覆盖测试,评测测试过程中已经执行的代码的多少,与之相对的是要执行的剩余代码的多少。具体而言代码覆盖率分析是这样一个过程:(1)找出程序经过一系列测试而没有执行的部分代码(2)创建一个附加的测试用例来增加覆盖率(3)决定代码覆盖的定量度量。
针对代码的测试覆盖率有许多种度量方式,例如:
    语句覆盖(StatementCoverage):也称为行覆盖(linecoverage),段覆盖(segmentcoverage)和基本块覆盖(basicblockcoverage)。它度量每一个可执行语句是否被执行到了,这个覆盖度量的主要好处是它可以直接应用在目标代码上,不需要对源代码进行处理,主要缺点是对一些控制结构很迟钝。
    判定覆盖(DecisionCoverage):也被称为分支覆盖(branchcoverage),所有边界覆盖(all-edgescoverage),基本路径覆盖(basispathcoverage),C2覆盖,判定路径覆盖(decision-decision-path或DDPtesting)。它度量是否每个BOOL型的表达式取值true和false在控制结构中都被测试到了。这个度量有语句覆盖的简单性,但是没有语句覆盖的问题,缺点是忽略了在BOOL型表达式内部的BOOL取值。
    条件覆盖(ConditionCoverage):它独立的度量每一个子表达式,报告每一个子表达式的结果的true或false。这个度量和判定覆盖(decisioncoverage)相似,但是对控制流更敏感。不过,完全的条件覆盖并不能保证完全的判定覆盖。
    路径覆盖(PathCoverage):也称为断言覆盖(predicatecoverage),它度量了是否函数的每一个可能的分支都被执行了。路径覆盖的一个好处是:需要彻底的测试。但有两个缺点:一是,路径是以分支的指数级别增加的,例如:一个函数包含10个IF语句,就有1024个路径要测试。如果加入一个IF语句,路径数就达到2048;二是,许多路径不可能与执行的数据无关。
    循环覆盖(LoopCoverage):这个度量报告你是否执行了每个循环体零次、只有一次还是多余一次(连续地)。对于do-while循环,循环覆盖报告你是否执行了每个循环体只有一次还是多余一次(连续地)。这个度量的有价值的方面是确定是否对于while循环和for循环执行了多于一次,这个信息在其它的覆盖率报告中是没有的。

3.软件开发生命周期模型有 瀑布模型快速原型模型迭代模型
答:
    瀑布模型(Waterfall Model):该模型由于酷似瀑布闻名。在该模型中,首先确定需求,并接受客户和SQA小组的验证。然后拟定规格说明,同样通过验证后,进入计划阶段…可以看出,瀑布模型中至关重要的一点是只有当一个阶段的文档已经编制好并获得SQA小组的认可才可以进入下一个阶段。这样,瀑布模型通过强制性的要求提供规约文档来确保每个阶段都能很好的完成任务。但是实际上往往难以办到,因为整个的模型几乎都是以文档驱动的,这对于非专业的用户来说是难以阅读和理解的。想象一下,你去买衣服的时候,售货员给你出示的是一本厚厚的服装规格说明,你会有什么样的感触。虽然瀑布模型有很多很好的思想可以借鉴,但是在过程能力上有天生的缺陷。
  快速原型(Rapid Prototype)模型:在功能上等价于产品的一个子集。注意,这里说的是功能上。瀑布模型的缺点就在于不够直观,快速原型法就解决了这个问题。一般来说,根据客户的需要在很短的时间内解决用户最迫切需要,完成一个可以演示的产品。这个产品只是实现部分的功能(最重要的)。它最重要的目的是为了确定用户的真正需求。在得到用户的需求之后,原型将被抛弃。因为原型开发的速度很快,设计方面是几乎没有考虑的,如果保留原型的话,在随后的开发中会为此付出极大的代价。 
  迭代式模型是是RUP(统一软件开发过程)推荐的周期模型。在RUP中,迭代包括产生产品发布(稳定、可执行的产品版本)的全部开发活动和要使用该发布必需的所有其他外围元素。所以,在某种程度上,开发迭代是一次完整地经过所有工作流程的过程:(至少包括)需求工作流程、分析设计工作流程、实施工作流程和测试工作流程。实质上,它类似小型的瀑布式项目。RUP认为,所有的阶段(需求及其它)都可以细分为迭代。每一次的迭代都会产生一个可以发布的产品,这个产品是最终产品的一个子集。迭代和瀑布的最大的差别就在于风险的暴露时间上。“任何项目都会涉及到一定的风险。如果能在生命周期中尽早确保避免了风险,那么计划自然会更趋精确。由于瀑布模型的特点(文档是主体),很多的问题在最后才会暴露出来,为了解决这些问题的风险是巨大的。"在迭代式生命周期中,根据主要风险列表选择要在迭代中开发的新的增量内容。每次迭代完成时都会生成一个经过测试的可执行文件,这样就可以核实是否已经降低了目标风险。"

5.已经代码段如下
#include <iostream>
using namespace std;
class Class1
{
	char contents[0];
};
class Class2
{
};
int main()
{
	cout<<sizeof(Class1)<<endl;
	cout<<sizeof(Class2)<<endl;
	return 0;
}

请问这段代码的输出结果为 1 1
答: 类的sizeof
 
三、方向性问答题(C/C++)
1.请编写一段代码,不使用系统提供的sizeof函数,测试当前主机上的一个int占用几个字节。(15分)
int *p = new int;
cout<<p<<endl;
p++;
cout<<p<<endl;

2,网卡的MAC地址为六个字节,一般用十六进制表示,比如00-50-8D-49-57-DB,也可用冒号分割,例如00:50:8D:49:57:DB,当然也会有类似00:50:8D:49-57DB这种不规范的写法(如果有分隔符的话,分隔符之间的字符就必然为偶数)。要求写一个函数,把已知的一段这样的字符串(以上三种情况都有可能出现)转化为6个字节以‘-’分隔的标准MAC地址,并对这个函数设计单元测试用例。(25分)
答:
void Solve(string str)
{
	int j = 0, cnt = 0;
	char ch[0];
	while(str[j] != '\0')
	{
		if((str[j] >='0' && str[j] <= '9') || (str[j] >= 'A' && str[j] <= 'F'))
		{
			ch[cnt] = str[j];
			cnt++;
		}
	}
	cout<<ch[0]<<ch[1]<<'-';
	cout<<ch[2]<<ch[3]<<'-';
	cout<<ch[4]<<ch[5]<<'-';
	cout<<ch[6]<<ch[7];
}

三、方向性问答题(java)

三、方向性问答题(系统)
1.请简述你对linux中proc虚拟文件系统的理解(20分)
答:
/proc 文件系统是一种内核和内核模块用来向进程 (process) 发送信息的机制 (所以叫做 /proc)。 与其他文件系统不同,/proc 存在于内存之中而不是硬盘上,因此是一个伪文件系统。这个伪文件系统让你可以和内核内部数据结构进行交互,获取 有关进程的有用信息,在运行中 (on the fly) 改变设置 (通过改变内核参数)。如果你察看文件 /proc/mounts (和 mount 命令一样列出所有已经加载的文件系统),你会看到其中 一行是这样的:
grep proc /proc/mounts
/proc /proc proc rw 0 0
/proc 由内核控制,没有承载 /proc 的设备。因为 /proc 主要存放由内核控制 的状态信息,所以大部分这些信息的逻辑位置位于内核控制的内存,通常是动态改变的。对 /proc 进行 一次 ‘ls -l‘ 可以看到大部分文件都是 0 字节大的;不过察看这些文件的时候,确 实可以看到一些信息。这怎么可能?这是因为 /proc 文件系统和其他常规的文件系 统一样把自己注册到虚拟文件系统层 (VFS) 了。然而,直到当 VFS 调用它,请求 文件、目录的 i-node 的时候,/proc 文件系统
才根据内核中的信息建立相应的文件 和目录。 

2.一段PHP代码如下所示,指出存在的漏洞是什么,如何预防。(20分)
<?php
$val=$_GET["reqno"];
echo $val;
?>

答:不会

三、方向性问答题(测试)

三、方向性问答题(前端)

四、综合题(除前端开发外,所有应聘技术的同学必答题,20分)
有一枚筛子,每个面都有一个数字:1~6.很显然,你会倾向于认为这6个面出现的概率是相等的,也就是:P(x1)=P(x2)=P(x3)=……=P(x6)=1/6。其中P(xi)表示出现数字xi的概率。假如,这枚筛子与其它筛子不同,似乎,他很容易滚到4或者5这个面上,所以这个筛子滚了足够多次以后,它出现的平均值恒定在4.5。这个时候,你会怎样分配P(x1)~P(x6)的概率呢?
答:不会,题目没懂。每个面的概率是随自己分配的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值