我正在尝试为其中一个 Hackerrank 问题编写解决方案。挑战是计算列表中的元素,元素从 0 到 99 不等,因此可以在线性时间内计算它们。这是我得到的:
{-# LANGUAGE BangPatterns #-}
{-# OPTIONS_GHC -O3 #-}
module Main where
import Data.STRef
import Data.Foldable
import Control.Monad
import Control.Monad.ST
main = do
line1 <- getLine
line2 <- getLine
let
!ns = map read $ words line2 :: [Int]
res = runST $ do
refs <- forM [0..99] $ \i ->
newSTRef (0 :: Int)
traverse_ (\x -> modifySTRef' (refs !! x) (+1) ) ns
mapM (\ref -> readSTRef ref) refs
putStrLn . unwords . map show $ res
此代码有效,但速度不够快,无法通过最后一个测试用例。有人可以建议对其进行改进吗?(问题链接)