如何在Haskell的列表中找到第二大数字?

时间:2013-10-01 21:34:00

标签: sorting haskell

问题是这样的:

编写一个带整数列表并返回其长度的函数 列表中的第二大整数。

我可以用两个函数解决这个问题,但有没有只使用一个函数的解决方案呢?

任何帮助表示赞赏! 谢谢!

4 个答案:

答案 0 :(得分:4)

不要让它变得复杂。

f xs = (sort xs !! 1, length xs)

如果您选择让它变得复杂,make it complicated in the right way

答案 1 :(得分:3)

已编辑使用@ThomasM.DuBuisson's建议

您可以通过使用折叠找到最大值来解决此问题。使用

可以非常简单地实现Max
mymaximum :: Ord a => [a] -> a
mymaximum xs = foldl searcher (head xs) xs
    where
        searcher :: Ord a => a -> a -> a
        searcher a b
            | a > b     = a
            | otherwise = b

所以我们可以通过跟上两个最大的值来实现它(注意我们必须用元组“播种”折叠):

nextmaximum :: Ord a => [a] -> a
nextmaximum xs = fst $ foldl searcher (h, h) xs
    where
        h = head xs
        searcher :: (Ord a) => (a, a) -> a -> (a, a)
        searcher (s, f) x = (min f (max s x), max f x)

答案 2 :(得分:2)

您可以一起编写各个功能。这既不高效也不健壮,但写起来很容易:

f xs = maximum . filter (< maximum xs) $ xs

答案 3 :(得分:1)

head . (!!1) . group . sortBy (flip compare) $ [1,1,2,3,4,4,4,5,5,6,6,6,6]
5