首页 > 试题广场 >

小红背单词

[编程题]小红背单词
  • 热度指数: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"还不能让小红记住。
这题是不是有问题啊?
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();

        int k=1;
        int sum =0;

        for(int i=0; i<n; i++){
            k++;
            sum = sum+k;
            if(sum>=n){
                break;
            }
        }
        System.out.println(k-1);

    }
}


发表于 2025-10-08 15:59:35 回复(1)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 创建Scanner对象,用于读取输入数据
        Scanner in = new Scanner(System.in);
        // 读取第一行输入的整数n,代表小红背诵单词的总次数
        int n = in.nextInt();

        // 定义HashSet集合,存储已经记住的单词(HashSet查询效率高,适合判断是否存在)
        Set<String> knownWords = new HashSet<>();
        // 定义HashMap,存储"未记住但已背诵过"的单词及其累计背诵次数(键:单词,值:累计次数)
        Map<String, Integer> countWords = new HashMap<>();

        // 循环遍历每一次背诵的单词(共n次)
        for (int i = 0; i < n; i++) {
            // 读取当前背诵的单词
            String word = in.next();
            
            // 若当前单词已在"记住的单词"集合中,直接跳过(无需再统计次数)
            if (knownWords.contains(word)) {
                continue;
            }

            // 若单词未记住:更新其累计背诵次数
            // getOrDefault(word, 0):若单词已在map中,取当前次数;否则取默认值0,之后+1
            countWords.put(word, countWords.getOrDefault(word, 0) + 1);

            // 获取当前已记住的单词总数k(记忆新单词的要求是:累计次数 ≥ k+1)
            int k = knownWords.size();
            // 检查当前单词的累计次数是否达到记忆要求
            if (countWords.get(word) >= k + 1) {
                // 达到要求:将单词加入"记住的单词"集合
                knownWords.add(word);
            }
        }

        // 输出最终记住的单词总数(即knownWords集合的大小)
        System.out.println(knownWords.size());
    }
}

发表于 2025-08-31 16:39:28 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
     public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());

        // 存储已经记住的单词
        Set<String> mem = new HashSet<>();
        // 记录单词背诵次数
        Map<String, Integer> cntMap = new HashMap<>();
        for (int i = 0; i < n; i++) {
            String word = in.nextLine();
            // 已经记住不再重复记
            if (mem.contains(word)) {
                continue;
            } else {
                int cnt = cntMap.getOrDefault(word, 0) + 1;
                // 记住单词 word
                if (cnt > mem.size()) {
                    mem.add(word);
                } else {
                    cntMap.put(word, cnt);
                }
            }
        }
        System.out.println(mem.size());
    }

}
发表于 2025-08-14 16:58:51 回复(0)