ABC081A - Placing Marbles

GitHub跳转原题关系图返回列表

统计三位字符串中字符 1 的个数,作为需要放置弹珠的格子数。

OJ: atcoder

题目 ID: abc081_a

难度:入门

标签:字符串haskell

日期: 2026-07-09 20:33

题意

输入一个长度为 3 的字符串,每个字符为 01。 统计其中 1 的个数并输出。

例如 101 中有 2 个 1,输出 2

思路

本题不涉及算法优化,重点是练习 Haskell 的基础 IO 和字符串操作。

核心流程:

  1. getLine 读入一行字符串
  2. filter (== '1') 过滤出所有 '1' 字符
  3. length 统计个数
  4. print 输出结果

代码

haskell
{-
 Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 rainboy的学习导航网站: https://idx.roj.ac.cn
 create_at: 2026-07-09 20:47
 update_at: 2026-07-09 20:47
-}
main :: IO ()
main = do
    s <- getLine
    let cnt = length (filter (== '1') s)
    print cnt

另一种写法,使用 dropWhile 去掉前导 0 后计数:

haskell
{-
 Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 rainboy的学习导航网站: https://idx.roj.ac.cn
 create_at: 2026-07-09 20:47
 update_at: 2026-07-09 20:47
-}
main :: IO ()
main = do
    s <- getLine
    let cnt = length . dropWhile (== '0') $ s
    print cnt

复杂度

时间复杂度 O(1)O(1),空间复杂度 O(1)O(1)

总结

Haskell 中处理简单输入输出和字符串过滤的基本模式: getLine 读入,filter 筛选,length 计数,print 输出。