这是一篇很尴尬的文章…因为我做完笔试了…发现…真的…好多题目…都不会。
首先是客观题部分:
第一题:
1 2 |
#define A 4 + 5 #define B A * A |
问 B * B 的值。
这道题的知识点考得就是 宏定义是在编译的时候展开的。
即在运算B*B之前,它已经展开成了 4+5*4+5*4+5*4+5
= 4 + 20 + 20 + 20 + 5 = 69…
后面的记不到题号了…
问题:三国杀里面 甄姬 洛神 的技能:在牌堆里拿一张牌进行判定,如果是黑牌,就留下,继续判定,如果是红牌就丢弃,停止判定。当时的题意是很好理解的。
问题是,一副正规的扑克牌里,问期望的拿到牌的数量是多少
这个题目就是一个期望的题目…因为是选择题。
这样期望值就是 0.5+0.5+0.375+……
选项里给出的最大值是1.2 所以我就选了那个。
额-好像算错了…看连接:
http://www.zhihu.com/question/44885710
64位系统下struct的大小 – char short int
char大小是1 short大小是2 int大小是4
这里存在的争议是能不用pack:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#include<iostream> using namespace std; struct Node1{ char c; short s; int i; }; struct Node2{ char c; int i; short s; }; #pragma pack(1) struct Node3{ char c; int i; short s; }; #pragma pack() #pragma pack(16) struct Node4{ short s; char c; int i; }; #pragma pack() int main() { cout << sizeof(Node1) << endl; cout << sizeof(Node2) << endl; cout << sizeof(Node3) << endl; cout << sizeof(Node4) << endl; } |
上面代码运行一下,题目当时是四个选项 8 16 12 7
现在看来可能正确的应该是 8 12 7 然而我只选了 8 和 12…
引用类型与值类型:
我晕,好像是C#里的概念…怪不得想半天想不通怎么没学过…
引用我知道,值我也知道…加个类型就不知道了…
对称序列:就是中序遍历序列…当时是猜的。
接下来是问,三个节点的二叉树,有多少种情况:
00 01 10 11 – 四种(这四种都是根只有左子树或者只有右子树的) 然后加上 根结点和左右子树的情况,一共五种。
还有一题是问寻道的。磁盘的磁臂在100的位置,然后有如下寻道要求,问平均寻道时间吧:
23,376,205,132,19,61,190,398,29,4,18,40
…这题我不熟。
然后是 DNS…
DNS 同时用了 UDP和TCP – 原题是运行在UDP上,不全面
DNS 端口号是53 – 这是对的。
默认缓存时间是1小时。 – 这个似乎是错的 Windows系统是一天。Chrome浏览器是60s…尴尬
提供的是域名与IP的转换 – DNS 只提供 域名到IP的转换,没有IP到域名的转换,原题是”域名和IP地址的相互映射“,所以可能是错的 – By小光
这里还有来自Dream苏 和 手抓饼的意见:DNS是可以IP – 域名相互解析的…
但是 我至今还是觉得因为一个Ip可以对应多个域名 – 所以不太可能会转换成功的。
下一个问题,有10个线程,时间片是200ms,切换线程用时是10ms…
问切换线程的时间比例吧。。。
0.05…
然后是问掩码的。
21.1.193.0/24
21.1.194.0/24
这个按二进制算就好了。
然后是一个同学之间打游戏的问题:
ABCDEF六个同学一起打Dota…一边最少五个人,最多一个人。问怎么让他们与其他小伙伴都赛过一次。
这是一个类二进制问题,2^2 = 4 <6 < 2^3 = 8
所以应该是3次…
再下一题,纸调题目。
1 2 3 4 5 |
int f(int n) { if(n<=3) return 1; else return f(n-2) + f(n-6) + 1; } |
问 f(f(9)) 调用了几次f函数。
f(9) -> f(7) f(3) ->f(5) f(1) -> f(3) f(-1)
总共是 7次 返回值也是 7…
f(7) -> f(5) f(1) -> f(3) f(-1)
所以是五次 总共是12次…
然后接下来
140.123.0.0 是一个B类IP地址。要划分10个子网怎么划分。
B类地址,网络号是到16位。后面的开始划子网的话。
2^3 = 8 <10 < 2^4 = 16
所以应该是前四位。128+64+32+16 = 192+48 = 240
故子网掩码应该是 140.123.240.0
下一题
1 2 3 4 5 6 7 8 9 |
int f(int a,int b,int c) { return 0; } int main() { return f(printf("a"),printf("b"),printf("c")); } |
问这个代码的输出结果:
我当时立马想到了 cout 的输出顺序是反的…
再次想到了应该不会这么简单吧,嗯,再想到了函数的默认参数为什么必须从后往前,会不会是从前往后赋值的(很明显这时候我忽略了入栈的情况!)然后!我就这样说服了自己,嗯,就是从前往后的。
然后…于是乎我选了abc…实际答案是 cba…晕!
PS. 以上都是个人思路变化…实际上 – 你们知道正确答案是cba 原因是压栈的操作就好了。
但是,这里是在Mac上的测试结果:
这是在Win10 的结果:
然后我在CentOS的虚拟机上再测试了一遍:
再试试我大VS…
看来只有Mac不一样,其他的都是cba – 即gcc的入栈顺序是从右往左…
还有一些二叉树的题目
CABEFDHG – 先序
BAFECHDG – 中序
问后序 – 我们知道一般求这种题目是必须知道一个中序的,所以这个概念也对我做那个对称序列起了很大的影响。
然后这一题,我是不太理解的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> using namespace std; int x = 4; int f() { static int x = 1; x *= x+1; printf("%d",x); } int main() { for(int i = 1;i<x;i++) { f(); } return 0; } |
凭着记忆…写出来的 – 尴尬。
正好验证了一下答案 2 6 42。(没有空格)
然后补充得到 x *= x+1 的计算是 x = x * (x+1)
嗯 – 又坑了…
还有个 **++ppp
还有个 *++*++ppp
我想说这种容易令人产生歧义的代码要尽力避免好么!!!心痛!
客观题我就只记得这么多了。然后是大题。
第一题是一个 [-90,90] 的区间,进行六次二分。不难的,要注意的是重点mid属于右区间。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> using namespace std; int main() { int n; cin >> n; int key = 6; int begin = -90; int end = 90; while(key--) { int mid = (begin + end) / 2; if(n >= mid) { cout << 1; begin = mid; } else { cout << 0; end = mid; } } return 0; } |
第二题玻璃球,其实这道题考老了…不过写出代码有加分可以弄死一批人了。
是一个DP思想的题目 – 我不会。
没办法,手算了一个题目出来。
8 16 23 28 32 35 37 39 只要确保最多9次就行了。
第三题是一个筛法打表 – 然后判断值是否相等的题目。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
#include <stdio.h> #include <iostream> #include <vector> #include <algorithm> using namespace std; int A[1010] = {0}; vector <int> su; //不知道你们看不到代码 - 筛法打表 - 时间复杂度O(n) int Cal(int n) { for(int i=0;i<1010;i++) { A[i] = -1; } A[0] = 0; A[1] = 0; A[2] = 1; for(int i = 2;i<=n;i++) { if(A[i] != 0) { A[i] = 1; su.push_back(i); for(int j = 2; i * j<= n; j++) { A[i*j] = 0; } } } } int main(int argc, char** argv) { int num; scanf( "%d", &num ); su.clear(); Cal(num); int result = 0; int begin = 0; int end = su.size() - 1; //两边逼近的话,是O(n) -PS.这个对齐功能很难用...尴尬 - 四个空格 = Tap的强迫症 while(begin <= end) { int temp = su[begin] + su[end]; if(temp == num) { result+=1; end--; begin++; } else if(temp > num) { end--; } else { begin++; } } printf("%d",result); return 0; } |
说真的我不确定这样对不对…
第四题是设计一个简单的商店管理系统,要求能够:
管理 商品 客户 订单…等。
dns也支持反向解析的 相互映射应该是对的
IP是最终服务器的标志符,是不存在再次解析的。DNS只有将域名解析到IP,查找域名对应的IP地址,而IP是不归属于域名的。一个IP地址可能对应多个域名 —— 一台计算机提供多个服务,既作www服务器又作邮件服务器。 IP地址还是唯一,但可根据计算机提供的多个服务给予不同域名。我也不太确定的…额手抓饼说是可以相互解析的…我这边改一下吧。
f(a, b, c)那题为啥我在mac上跑的结果是abc。。。
加我QQ2992965440发张图给我,我是在Win10下测试的
谢谢了…
甄姬那题期望好像是1
能否给个稍微详细的计算方法
你百度一下甄姬 洛神 期望就行了
谢谢,你是对的》。。
DNS那题 选53端口那个,其他都错DNS 同时用了 UDP和TCPDNS 只提供 域名到IP的转换,没有IP到域名的转换,原题是”域名和IP地址的相互映射“
十分感谢!