面试的时候,碰到最后一道题,如下:
一开始我以为这是他们公司自己出的道普通的算法题,就没有多想,就画了图,把代码补充完整,代码如下:
UpAll(n)
{
if(n==1) UpOne(1);
else if(n==2) UpOne(1);UpOne(2);
else UpAll(n-1) DownAll(n-2);UpOne(n);
}
本来做完就好了,但是回过头去看那条件的时候,我就发现很纠结(个人有很强的强迫症),一根棒子串过环,而且还是按顺序的串起来,那怎么可能做到前面还有环的时候,还可以取下后面的环(本屌之前没有听说过九连环这玩具,更别说它是怎么玩的了),思来前后,实在受不了,叫HR过来,想问问出题的技术总监,这题是不是他们自己出,我感觉这题有问题,想聊聊,但是HR说总监没在,说题没有问题,迫于坚持真理的情况下,我把上面写的代码划掉,如上图所看到的,我只写了:基于理性,我实在是无法想象怎么在没有去掉前环的情况下,取掉后面的环!这就和我当初读书考试写作文的时候,一直鸟穿越太平洋,请发挥你的想象力,写一篇不少于800字的作文,请试想一下你让一个理科生如何接受一只鸟能横穿太平洋,那次作文我也只答了:无法想象一只鸟能穿越太平洋,违法了常理!这些不按常理出牌的东西,让我这个理科生很是难受,也不会去接受!
于是面试完我回来查了下九连环,百度了下,原来是真的存在的东西,当时吓尿,世界三大智力玩具之一,好叼,玩法也和上面的介绍的一样,要取下或者装上n,那么n-1必须在且n-2必须取下,真是涨见识了,中国发明的东西真是高深莫测,又再一次毁了我的理念观,特来发此贴,让大家知道我们中国人的智力不是常理能够解释的!像中国的智力玩具-----九连环致敬!
其实九连环的算法十分简单,我这也简单介绍,网上也有了,按上面的题,你画个图就可以清楚得出思路
要取掉这个九连环必须从最低层开始,也就是2或者3环开始,这就涉及到你要取环是单数还是双数,如果输入的双数,那你就从2环开始取下,如果是单数,那得从1环开始,所以,得先判断然后再递归,if(n==1) {DownOne(1)} else if(n==2) {DownOne(2);DownOne(1);}然后才是第3种情况开始的递归取,假设这个n是5,你要取掉5,那么你必须取掉5-2之前的环也就是第3个环,DownAll(n-2),现在5-1的环也就是4环还在,所以可以取掉5环也就是n,DownOne(n),那现在5环取掉了,接着就是取掉第4个环,要取掉第4个环就必须第3个环在,前2个环不在,现在前3个环不在,所以要UpAll(n-2),然后就是去下个环的参数了递归DownAll(n-1),这是取环的思路,装环的思路也和这个差不多,我这里就不多解释了,代码上面有,不过我没有经过检验,错了可以提出,我改,这里就不做多检验了。
完成代码:
DownAll(n)
{
if(n==1)DownOne(1);
else if(n==2){DownOne(2);DownOne(1);
else DownAll(n-2); DownOne(n); UpAll(n-2); DownAll(n-1);
}
UpAll(n)
{
if(n==1) UpOne(1);
else if(n==2) UpOne(1);UpOne(2);
else UpAll(n-1) DownAll(n-2);UpOne(n);
}
特此声明,我写此贴不是想吐槽面试,而是想多点人认识下中国的传统东西,不只是只要外国人的东西才考智力的,中国的东西也很博大精深的,希望可以看到多点这些把中国传统东西用代码解出来的帖子!好了,散分!