您的位置:首页 > 其它

2014百姓网暑期技术实习笔试

2014-05-14 18:50 323 查看
前天听同学说下午百姓网会来学校,有现场笔试,可以直接去。

效率确实好高,到了后准时开始,废话不多。笔试半个小时,四个开放题。大致如下:

给出一种方法,用于精确计算一个不规则形状的面积。
有一种母牛,寿命5年,第二年底会生出一头同品种母牛,第四年又生出一头,第五年死去。现有一头这样的母牛,问N年后有多少母牛?
在你的理解中,for语句有多少种用法/用途?
用一种编程语言计算从m乘到n后结果中有多少个0?(m<=n)

第二题好像曾经做过。。。但是下午没有写出来,写了思路:建树,节点是牛,子节点是父节点生的小牛,权值是间隔的年份,每个节点有个深度值,第一个点深度值为0。因为每头牛只能生两胎,所以画下来就是个二叉树了。求N年后牛的数目时,建个log(N/2)层的树,遍历,深度值在(N-5,N] 的就是活着的牛了。

我比较弱,没发现规律。其实每头牛只能生两胎,两胎后下一年就去世了。所以偶数年还活着的要么是还没生过,要么生过一胎,在年底都可以再生一胎;奇数年从5开始,每年都会少一头。

int f(int n){
if (n==1 || n==0)
return 1;
if(n==3)
return 2;
if(n%2==0)
return f(n-1)*2;
else
return f(n-1)-1;
}


回来后查了下百姓网的笔试题,只看到一个关于判断查询子集的讨论。

比如这里:http://www.07net01.com/linux/_baixingwanggongkaibishiti_chaxuntiaojiandezijipanduan_deyifen_PHP_dajuan_106852_1364377530.html

原文:

原题见 百姓网公开笔试题:查询条件的子集判断

我的答卷在 http://soulogic.com/subset_test/subset_test.tar.gz
演示地址为 http://soulogic.com/subset_test/
碰到这道题时才意识到自己的见识浅薄,非等到这种题出来才能明白,高等数学对于程序员而言是多么重要。其中最难最关键的部分是在留言里看到了 qmigh 的解释才搞定的。

这道题分三部分:把查询语句转成数组结构,然后把层级混乱的条件最终分解成 以 OR 关联的 AND 合集(也就是 qmigh 所解释的),以及按规则来读取并判断两个数组。在我的代码里,Class TreeStore 负责前两步,Class SetCheck 负责后一步。

由于我完全说不出任何术语,只能把数组的转换过程列一下了。

原始语句

a = 1 AND (b = 1 OR (c = 1 AND (e > 1 OR f = 1)))

第一步,循环用正则,从最里面的括号开始,分解出每一级。这样每一级里面都没括号了

Array

(

[1] => e > 1 OR f = 1

[2] => c = 1 AND _1

[3] => b = 1 OR _2

[4] => a = 1 AND _3

)

按照 AND OR 的优先级进一步分解

Array

(

[AND] => Array

(

[0] => a = 1

[1] => Array

(

[OR] => Array

(

[0] => b = 1

[1] => Array

(

[AND] => Array

(

[0] => c = 1

[1] => Array

(

[OR] => Array

(

[0] => e > 1

[1] => f = 1

)

)

)

)

)

)

)

)

将上述数组最终分解成 OR 下的一堆 AND

Array

(

[OR] => Array

(

[0] => Array

(

[AND] => Array

(

[0] => a = 1

[1] => b = 1

)

)

[1] => Array

(

[AND] => Array

(

[0] => a = 1

[1] => c = 1

[2] => e > 1

)

)

[2] => Array

(

[AND] => Array

(

[0] => a = 1

[1] => c = 1

[2] => f = 1

)

)

)

)

其实就是按 qmigh 说的,做一下转换,把最开始的表达式转换为

(a = 1 AND b = 1) OR (a = 1 AND c = 1 AND e > 1) OR (a = 1 AND c = 1 AND f = 1)

如果只有一个表达式,可以理解为只有一个元素的 AND

如果

(a > 3) AND (b < 4)

可以用数组表示为

array(

[0] => a > 3

[1] => b < 4

)

那么

a > 3

可以用数组表示为

array(

[0] => a > 3

)

OR 也同理

用来判断时的数组样子,也就是 Class TreeStore 的最终输出

Array

(

[0] => Array

(

[a] => Array

(

[=] => Array

(

[1] => 1

)

)

[b] => Array

(

[=] => Array

(

[1] => 1

)

)

)

[1] => Array

(

[a] => Array

(

[=] => Array

(

[1] => 1

)

)

[c] => Array

(

[=] => Array

(

[1] => 1

)

)

[e] => Array

(

[>] => 1

)

)

[2] => Array

(

[a] => Array

(

[=] => Array

(

[1] => 1

)

)

[c] => Array

(

[=] => Array

(

[1] => 1

)

)

[f] => Array

(

[=] => Array

(

[1] => 1

)

)

)

)

至于判断,应该不算难,按照上面的数组挨个字段判断就可以了。以及判断父集合是否有子集合没有的字段,如果有,那肯定不是子集关系了。

写完之后一直没把握到底做的对不对,要是有类似 ACID 2 或者 Man or boy test 那样的东西就好了。如果能有人告诉我有什么复杂条件是我的代码判断不了的,实在感激不尽(当然,用 10MB 长的条件语句搞溢出不算……)

看了看 其他人的答案,“从离散数学到编译原理”,这标题总结得不错,核心也就是这两个问题吧。我用正则来把编译”那部分绕过去了,但从执行效率上讲是很蠢的。

看来大家都知道画蛇添足的故事,所以都只做了满足要求(“为了简单起见,只需要实现最简单的AND, OR逻辑操作,大于,等于,小于三种比较操作就好”)的最小实现。

如果能有PHP同好的题解能相互学习学习那是最好了,其他语言的看不懂 -_-

原来还自诩为程序员,被这道题臊的不行,我现在的定义是,没法独自实现一个 C Compiler 的人充其量也不过是 coding fans。

————————————————原文终。(表示没有学过PHP- -)

后记:我太弱了,笔试没过。。。不过上面这个题目蛮好玩的样子。看到一个用python实现的:http://www.360doc.com/content/11/0410/20/4825484_108675437.shtml

再记:后来看到有人po了一样的题目,要是早点看到就好了!(不过水平弱就是弱- -)http://www.fenzhi.com/gsmsh479121.html

以及一个相似的:http://www.chengxuyuans.com/job_interview/64110.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: