Filter Elements:haskell基本操作

Filter Elements:haskell基本操作

从序列中输出那些出现至少k次的元素

函数式解法就是构造一系列的函数,然后进行函数间的组合来解决问题。此题还是多组读入,在读入时就是做一个递归,每次递归将当读取序列和K值,然后将序列和K值传入一个过滤函数,在传之前先构造两个序列,一个是按原顺序去重的序列,一个是将元素和出现次数构成元组的序列。传入过滤函数时,对于每个出现在去重序列的元素,判断它的出现次数是否不小于k,若是则输出,并递归地读到下一个去重序列元素,直至去重序列为空,一次计算则结束

import Data.List

main=do
    line<-getLine
    mainLoop (read line::Int)

mainLoop ::Int -> IO()
mainLoop 0 =return()
mainLoop n=do
    line<-getLine
    let k=last [read x::Int | x<-words line]
    line<-getLine
    let r=[read x::Int | x<-words line]
    let singleElemArray=nub r
    
    let groupedArray=[(head x,length x)|x<-group $ sort r]
    
    output [fst x|x<-groupedArray,(snd x)>=k] singleElemArray
    mainLoop (n-1)    

output :: [Int]->[Int]->IO()
output [] _ =putStrLn "-1"
output x [] =putStrLn ""
output x (y:ys)=if (y `elem` x) 
    then do
        putStr ((show y)++" ")
        output x ys
    else 
        output x ys

发表评论

电子邮件地址不会被公开。 必填项已用*标注