首页 > 试题广场 >

小红背单词

[编程题]小红背单词
  • 热度指数:2790 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小红每天都要背单词,然后她会把每天记住了多少单词记录下来,并在小红书上打卡。

当小红背单词时,如果她已经记住了i个单词,且背了一个没有记住的新单词i+1次,则她就会记住这个新的单词。
例如,当她按顺序背["you","thank","thank"]时,她第一次背单词"you"时她就能记住"you"。而由于她已经记住了一个单词,所以需要背两次"thank"才能记住"thank"。

现在你知道了小红背单词的顺序,请你求出小红今天记住了多少个单词。

输入描述:
第一行一个整数n(1 \leq n \leq 10000)
接下来n行,每行一个字符串,保证每个字符串长度不超过 10。


输出描述:
输出一个整数,表示她记住了多少个单词。

示例1

输入

5
you
thank
queue
queue
thank

输出

2

说明

小红先记住了单词"you",又因为背了两次"queue",于是记住了单词"queue"。由于已经记住了两个单词,所以背两次"thank"还不能让小红记住。
思路:
用一个哈希Map记录每个单词出现频次,用一个哈希Set记录已经记住的单词,用变量ans记录记住的单词数目;
遍历单词,统计单词出现频次,如果当前单词不在已记住的单词集合中且频次等于ans+1,那么就ans++,并加入已记住的单词集合中。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        let n = Number(line);
        let ans = 0;
        let map = new Map();
        let memed = new Set();
        for (let i = 0; i < n; i++) {
            let word = await readline();
            map.set(word, (map.get(word) || 0) + 1);
            if (!memed.has(word) && map.get(word) === ans + 1) {
                memed.add(word);
                // console.log(word, map.get(word))
                ans++;
            }
        }
        console.log(ans);
    }
}()



发表于 2025-09-26 08:42:33 回复(0)