给出了一个整数列表。找出其中重复次数最多的数字。如果有多个这样的数字,则返回其中的最大值。
mostFrequent :: [Int] -> Int
--mostFrequent [1,2,2,2,3,3]
--2
--mostFrequent [1,2,2,3,3]
--3
Run Code Online (Sandbox Code Playgroud)
我将这些数字分组为一对列表并排列它们。但是后来我不知道如何比较它们并输出列表中重复次数最多和最大的数字。
mostFrequent :: Ord a => [a] -> [(Int,a)]
mostFrequent list = map (\l -> (length l, head l)) (group (sort list))
--mostFrequent [1,2,2,3,3]
--[(1,1),(2,2),(2,3)]
Run Code Online (Sandbox Code Playgroud)
帮我解决这个问题。
你绝对在正确的轨道上:
然后:
Ord成对实例为您提供字典顺序,这正是您在这里想要的。)import Data.List (group, sort)
mostFrequent :: [Int] -> Int
mostFrequent ns =
snd (maximum [ (length ks, head ks) | ks <- group (sort ns) ])
Run Code Online (Sandbox Code Playgroud)
> mostFrequent [1,2,2,2,3,3]
2
> mostFrequent [1,2,2,3,3]
3
Run Code Online (Sandbox Code Playgroud)
如果你喜欢无点风格,你当然也可以这样写:
import Control.Arrow ((&&&))
import Data.List (group, sort)
mostFrequent :: [Int] -> Int
mostFrequent = snd . maximum . map (length &&& head) . group . sort
Run Code Online (Sandbox Code Playgroud)