阿里巴巴 2017校园招聘笔试试题——技术岗.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《阿里巴巴 2017校园招聘笔试试题——技术岗.pdf》由会员分享,可在线阅读,更多相关《阿里巴巴 2017校园招聘笔试试题——技术岗.pdf(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 选择题 第一题,两台电脑在局域网中,机器为千兆网卡,一台作服务器里面有一张两台电脑在局域网中,机器为千兆网卡,一台作服务器里面有一张网页为网页为 1K 字节,问另一台下载这个网页的速度。字节,问另一台下载这个网页的速度。 我答:我不知道 1K 是指 1024 还是 1000不过按我的算法没区别,1000 000000/8/1k 我选了 10 000 张/秒 第二题,单链表插入一个节点的问题。在 p 指向的节点后插入一个 q 指向的节点。 我答:q-next=p-next;p-next=q; 之后乱序,我记不清楚题号了。 有一题,地图染色问题,每个国家用矩形表示,让相邻国家颜色不同。离散里面有
2、 有一题,问快速排序达到最坏情况时间复杂度 n2 的原数数组的具体情形。见数据结构 有一题,很扯的指针取址符号混乱,选项却很白痴。 有一题,入栈序列 1,2,3,4,5,.,n,第一个出栈的是 n,问第 i 个出栈的是多少。 我答:n-i+1 最后一题,给中缀和后缀表达式,求前缀表达式。 填空题 第一题:数组第一题:数组(a1,a2,a3,a4.,an),删除任意一个的概率相同,问平均删除一个要移动多,删除任意一个的概率相同,问平均删除一个要移动多少个少个。 我答:(n-1)/2 第二题:一个程序填空,程序大意是在数组里面找第二大的数。一个程序填空,程序大意是在数组里面找第二大的数。 注:不难
3、注:不难 第三题:大致如下一个程序片段: void xxx(x) intcountx=0; while(x) countx+; x=x&(x-1); coutcountxendl; 问 xxx(9999)输出什么。 我答:8,记得做 ACM 的时候碰到过那个式子,貌似关于排列的,具体意思忘记了,搞一下可以明白是 x 变成二进制,里面有多少个 1 就是答案。 第四题:大致如下一个代码 inta32=1,2,3,4,5,6; int*p3; p0=a1; 问*(p0+1)是个什么东西 我答:4,蛮基础嗯。 简答题 第一题:7 公斤米,50 克砝码,200 克砝码各一个,称 1350 克米问最少要多
4、少次,并编程回答。 我答,6 次,可能一开始会想到 1350/250 + 2 = 7 次,说明贪心无效。我不知道我的方法是不是很笨,用了递推,或者你可以看成是动态规划。转化一下题目的意思就是 1 克和 4 克砝码,问多少次称出 27 克大米,FN代表 N 克大米最少需要多少次。 则有: FN=minFN-1,FN-4,FN-5+1 代码如下: intfindmin(int weight) int v= weight/50; int f150; f0=0;f1=1;f2=2;f3=3;f4=1; if (v5) return fv; int i; for (i=5;i=v;i+) fi=min(
5、fi-1+1,fi-4+1,fi-5+1); return fv; 注:我一开始愣了很久,我在想,称好的大米可以作为砝码来用吗?这样就是另一种问题了吧。 附加: 如果天平能做为平衡工具的话,两次平分到 1750 克,然后两次量出 200 克,1750-400 就是1350 克了。 。 。四次。 。 。 。 解答题第一题: 第一次:200+50,称出 250g 第二次:200+250,称出 450 第三次:200+450,称出 650 共称出 1350g 第二题,有有 N 个蛋和个蛋和 M 个篮子,把蛋放到个篮子,把蛋放到 M 个篮子里,每个篮子都不能为空。个篮子里,每个篮子都不能为空。另外,需
6、要满足:任意一个小于另外,需要满足:任意一个小于 N 的正整数,都能由某几个篮子内蛋的数量相加的的正整数,都能由某几个篮子内蛋的数量相加的和得到。写出程序,使得输入一个和得到。写出程序,使得输入一个(N,M),输出所有可能的分配情况。,输出所有可能的分配情况。 我答:不能想出算出所有摆放方法的方法,期待 ACM 大牛路过。 (1. 先取 M 个蛋放入 M 个篮子(一个篮子一个蛋) 2.剩下的(N-M)个蛋按照 1,2,4, 。 。方式依次维持各个篮子中蛋的数量(要有一个篮子保持只有一个蛋) ,若最后的蛋不是 2 的方次,有多少放入一个篮子 3.取 L(L=N)个蛋时, 应按二进制编码值考虑,
7、如 13 个蛋: 13 的二进制码值是 1101,则取有 8 个、4 个和 1 个蛋的篮子即可。 另外:题目不完整,N 与 M 应该有数量关系:M=N 且 Nm 并且 n 小于 100 public class Test private int m; private int n; private int eggs; private int numAnswer; Test() m=10; n=20; numAnswer=0; eggs = new intm; for(int i=0;i=m) statesum = true; return ; fill(state,step+1,sum); fi
8、ll(state,step+1,sum+eggsstep); /* * 判断是否满足:任意一个小于 N 的正整数,都能由某几个篮子内蛋的数量相加的和得到 * 算法:暴力枚举所有篮子的组合 * return */ private boolean judge() boolean state = new boolean n+1; for(int i=0;i=n;i+) statei = false; fill(state,0,0); for(int i=1;i=n;i+) if(!statei) return false; return true; /* * 给每个篮子分鸡蛋,升序(后一个篮子的鸡蛋
9、必须不小于前一个篮子,避免重复计算) * param pre 前一个篮子鸡蛋数 * param already 前 step 个篮子 已使用的鸡蛋数 * param step 第 step 个篮子 */ public void solve(int pre,int already, int step) if(step=m-1) /最后一个篮子 eggsm-1=n-already; /不符合条件 if(eggsm-1pre) return; /判断是否满足:任意一个小于 N 的正整数,都能由某几个篮子内蛋的数量相加的和得到 if(judge() for(int i=0;im;i+) System.
10、out.print(eggsi+ ); System.out.println(); numAnswer+; return ; / 给第 step 个篮子装鸡蛋,pre 到 n-already 种可能 for(int i=pre; i=n-already; i+) eggsstep=i; /递归 solve(i,already+i,step+1); public static void main(String arg ) Test test = new Test(); test.solve(1,0,0); System.out.println(可能情况的数量:+test.numAnswer);
11、解答 2 using System; using System.Collections.Generic; using System.Text; namespace CmpSplitEgg class Program static void Main(string args) SplitEgg(); public static bool SplitEgg() / 初始化变量,差额 diffNum = 鸡蛋数 eggNum - 篮子数 basketNum int eggNum = 0, basketNum = 0, diffNum; / 输入鸡蛋数、篮子数 Input(ref eggNum, re
12、f basketNum); / 排列结果,并初始化 int resultEggs = new intbasketNum; for(int i=0;ibasketNum;i+) resultEggsi = 1; / 差额 = 鸡蛋数 - 篮子数 diffNum = eggNum - basketNum; if (diffNum 0) Console.WriteLine(You cant make N M); return DoAgain() & SplitEgg(); else if (Math.Pow(2, basketNum) 2M); return DoAgain() & SplitEgg
13、(); / 对任意一个小于 N 的数 总能使几个篮子里的鸡蛋总数等于它,则需要编号 n 的篮子 放的鸡蛋数=前面的鸡蛋数总和+1 / 基于 2 进制编码是能表示所有数字且位数最小的编码方式,上面条件由此推出 / 假设组合为升序排列,第一个篮子必然为 1 个鸡蛋 RandomLay(resultEggs, 1, eggNum); / 是否重新做一次 return DoAgain() & SplitEgg(); / / 重新选择 / public static bool DoAgain() Console.WriteLine(); Console.WriteLine(if you want to
14、enter the N and M again?Yes(Note: if not enter Y or y, the application will quit.)); string choice = Console.ReadLine(); return choice.ToLower() = y; / / 输入 / / 鸡蛋数量 / 篮子数量 public static void Input(ref int eggNum, ref int basketNum) while (true) try Console.WriteLine(Please enter the egg number N:);
15、 eggNum = Convert.ToInt32(Console.ReadLine(); Console.WriteLine(Please enter the basket number M:); basketNum = Convert.ToInt32(Console.ReadLine(); break; catch (Exception) Console.WriteLine(Enter error: please input integer!); Console.WriteLine(); continue; / / 随即放置鸡蛋 / / 结果 / 开始索引 / 鸡蛋数 public sta
16、tic void RandomLay(int result, int index, int total) / iMax 为 index 对应可取鸡蛋数上限 int iMax = 1, basketNum = result.Length; for (int j = 0; j index; j+) iMax += resultj; / 复制 int copyResult = new intbasketNum; for (int i = 0; i basketNum; i+) copyResulti = resulti; / 结束条件 1:已为最后一个篮子 if (index = basketNum
17、 - 1) int mBasket = total - iMax + 1; if (mBasket = iMax) copyResultindex = mBasket; Console.Write(Split solution: ); foreach (int res in copyResult) Console.Write(res + ); Console.WriteLine(); return; for (int ii = copyResultindex - 1; ii total) break; copyResultindex = ii; RandomLay(copyResult, in
18、dex + 1, total); 解答 3 code=C/C+/code#include #include #include #include using namespace std; struct solution int *ptr; struct solution *next; ; typedef struct solution solu; int* first(int n,int m); /计算出第一种组合 solu* others(int n,int m,solu *head,solu *prior); /计算出其他组合 int sum(int n,int *p); /计算前 n-1
19、个篮子里的蛋数和 bool only(solu *head,int *p,int m); /检查组和是否满足要求 int ways; /全局变量,保存组合的方法数 void main() int n=0,m=0,i=0,k=0; solu *head=NULL; solu *temp=NULL; LABLE: coutn; coutm; if(m=0|nn|(double)n=pow(2.0,m) /对 m,n 的约束 cout输入不合法!endl; goto LABLE; cout正在计算.endl; head=others(n,m,head,NULL); /调用 others 开始计算 t
20、emp=head; ofstream file(D:egg.txt); /结果保存着这个目录下 cout共有ways种组合方式:endl; file共有ways种组合方式:endl; k=ways; while(temp!=NULL&ways) cout方式k-ways+1:endl; file方式k-ways+1:endl; for(i=0;im;i+) coutptr+i) ; fileptr+i)ptr; temp=temp-next; coutendl; fileendl; ways-; file.close(); couti; int sum(int n,int *p) /计算前 n
21、-1 个篮子里的总蛋数 int total=0; for(int i=0;in;i+) total+=*(p+i); return total; int* first(int n,int m) int *p,i=0,temp1=0,temp2=0; p=(int *)malloc(m*sizeof(int); for(i=0;im-1) /剩下的蛋数大于前面 m-1 个篮子里的蛋数和, *(p+m-1)+=m-1; while(sum(m,p)0;) temp2=sum(i-1,p); /第 i 个篮子前面的所有篮子里的蛋数的总和 if(*(p+i-1)=temp2) /第 i 个篮子里的蛋数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 阿里巴巴 2017校园招聘笔试试题技术岗 2017 校园 招聘 笔试 试题 技术
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内