最近在博客園看到了據說是騰訊和百度的筆試題,原文地址
http://www.cnblogs.com/bestDavid/p/ExaminationTencent.html
http://www.cnblogs.com/bestDavid/p/ExaminationBaidu.html
確實是時候告訴大家haskell是多么美妙的一種語言了。閑話少說,直入主題。
騰訊2014軟件開發筆試題目
-----9月21日,騰訊2014軟件開發校招-簡答題-廣州
2、A、B兩個整數集合,設計一個算法求他們的交集,盡可能的高效。
---------------------------------------------------
module Main where --先把Main放到這再說
main = do print [x|x<-a,y<-b,x==y] --x符合這樣的特征,x來源於a,y來源於b,並且x和y是相等的,好吧,如果這個還沒有過癮,來看下面這個!!!
a = [1,3,4,5,7,9,23,43] --給個整數集合a
b = [4,9,87,56,45,1,8,7,5] --給個整數集合b
---------------------------------------------------
百度2014校招筆試題目題解
----武漢站,9.28號百度校招筆試題目算法題目部分
1、給定任意一個正整數,求比這個數大且最小的“不重復數”,“不重復數”的含義是相鄰兩位不相同,例如1101是重復數,而1201是不重復數。(15分)
---------------------------------------------------
{-題目的關鍵是重復數,在haskell中我們有一個武器叫模式匹配(不是正則哦),於是如果你知道什么是數學歸納法的話,秒秒鍾的事-}
module Main where
main = do print $ head [x|x<-[a..],(renum $ show x)==False] --這里有haskell一個誘人的特性:惰性計算,Integer是枚舉類型類的實例,於是x來源於[a..],你可能會說[a..]是個無窮集合,這個程序永遠也跑不完吧?不要忘了我前面說的惰性計算,haskell可是很懶的哦,由於head,haskell就只會找到第一個比a大並且不是重復數的數啦
a = 23497811032 --給定一個數a
--數學歸納法重出江湖,語驚四座。解釋用show將a轉成字符串用renum調用
renum [] = False --初始條件:空字符串直接告訴他不是重復數
renum (x:[]) = False --初始條件:只有一個字符的不是重復數
renum (x:xs) =if x == head xs then True else renum xs --模式匹配(x:xs),一旦x和xs的第一個字符相同直接就是重復數,如果不同,繼續用xs調用renum,這個直到初始條件,如此便是歸納法的世界了。
--------------------------------------------------
通過這兩個例子,希望大家能夠對haskell產生強烈的興趣,看到不一樣的卓越的編程語言是如何思考世界的。